2013-04-29 2 views
0

У меня есть модель городов, и одним из атрибутов является название города.Rails - как вернуть только текст записи ActiveRecord

Я сделал вспомогательный метод для возврата 'п' число городов и реализация ниже:

вспомогательный метод:

def list_cities(start, stop) 
    cities = City.find(:all, order: "name asc", limit: stop-start, select: "name") 
    cities.each do |city| 
     "<li> #{city.name} </li>" 
    end 
end 

вид Код:

<%= list_cities(1,22) %> 

Однако , он возвращает следующее на вид:

[#<City name: "Abilene">] 

Как получить только текст названия города и избавиться от остальной части запроса?

+0

Это звучит, как вы ищете срывать: http://apidock.com/rails/ActiveRecord/Calculations/pluck – John

ответ

2

Проблема заключается в том, что ваш метод list_cities не возвращает строку, которую вы думаете, что она делает. Он просто возвращает массив городских объектов, потому что это то, что каждый из них делает. Похоже, вы смешиваете контроллер и рассматриваете логику в помощнике. То, что я хотел бы сделать это:

Установить переменную @cities экземпляра в контроллере:

@cities = City.find(:all, order: "name asc", limit: stop-start, select: "name") 

По мнению:

<% @cities.each do |city| %> 
    <li><%= city.name %></li> 
<% end %> 

Таким образом, вы держите ваш контроллер и вид логики разделены.

+0

Хорошо, что работал для меня. Но я предполагаю, что следующий вопрос: если этот тип логики не предполагается помещать в помощника, то каково идеальное использование вспомогательных методов? – Zephyr4434

1

Что Эрез ответил, это лучший способ подойти к этой проблеме. Но я хотел бы поделиться тем, что вы можете сделать с вашим методом, чтобы добиться того, чего хотите, с минимальными изменениями. Вам необходимо сменить ваш помощник на следующее:

def list_cities(start, stop) 
    cities = City.all(order: 'name ASC', limit: stop - start, select: 'name') 
    cities.map { |city| "<li> #{city.name} </li>" }.join.html_safe 
end 

Другие изменения - это всего лишь небольшие рефакторики для уменьшения кода. Не зная версию рельсов, которую вы используете, я не изменил запрос, но если вы используете 3.2, у вас должен быть доступ к pluck, который быстрее, поскольку он не будет создавать объекты ActiveRecord.

+0

У меня есть доступ к сбою. Будет ли тогда запрос: City.all (порядок: 'name ASC', limit: stop-start) .pluck (: name)? – Zephyr4434

+0

nope. Он должен быть скован как «City.order (« имя ASC »). Limit (stop-start) .pluck (: name)' – jvnill

0

Try:

def list_cities(start, stop) 
    content = '' 
    cities = City.find(:all, order: "name asc", limit: stop-start, select: "name") 
    cities.each do |city| 
    content << "<li> #{city.name} </li>\n" 
    end 
    content 
end 
Смежные вопросы