2014-09-06 3 views
0

Я пытаюсь сделать выбор со всеми странами мира с количеством пользователей внутри() в правой части имени. Это как мое выпадающее меню должно выглядеть следующим образом:Как добавить условие внутри @ object.map внутри f.select в ruby ​​

--Все-- (15)
Испания (2)
Соединенные Штаты Америки (10)
Словакия (3)

До сих пор у меня есть все страны и пользователи, перечисленные в этом списке, выбираются для всех стран, но проблема связана с опцией -ALL--. Значение опции «AllAll» равно «». Он должен учитывать всех пользователей в мире, но подсчитывает всех пользователей, у которых нет страны, со значением «» в базе данных.

Это код, как я показать все страны для каждого значения избранных:

<%= f.label :country, "Country" %> 
<% if @country_sel %> 
    <%= f.select :country_sel, @country.map{ |p| [p.country_name + ' ('+ User.where("cc_iso LIKE ?", p.cc_iso).count().to_s + ')', p.cc_iso] }, :selected => @country_sel %> 
<% else %> 
    <%= f.select :country_sel, @country.map{ |p| [p.country_name + ' ('+ User.where("cc_iso LIKE ?", p.cc_iso).count().to_s + ')', p.cc_iso] } %> 
<% end %> 

это код, который я пытаюсь написать для того, чтобы все страны в мире в списке в правой части опции -ALL--.

<% if @country_sel %> 
    <%= f.select :country_sel, @country.map{ |p| [p.country_name + ' ('+ User.where("cc_iso LIKE ?", p.cc_iso).count().to_s + ')', p.cc_iso] }, :selected => @country_sel %> 
    <% else %><%= f.select :country_sel, @country.map{ |p| [p.country_name + ' ('+ %> 
     <% if p.country_name == "" %><%= User.all.count().to_s + ')', p.cc_iso] } %><%else %><%= User.where("cc_iso LIKE ?", p.cc_iso).count().to_s + ')', p.cc_iso] } %> 
     <%end%> 
<% end %> 

Но это не работает, я не знаю, как писать, если условия внутри карты внутри f.select. Я не знаю, если я иду по правильному пути :)

Можете ли вы мне помочь?

Большое спасибо

+0

если '@ country' является объектом, вы не можете назвать' @ country.users.count'? –

+0

Привет, Мохаммад, конечно, я тоже могу это сделать. Проблема в том, где я могу положить ее внутри карты? Требуется только для опции ALL. – user3777245

+0

Настройте свою ассоциацию правильно, как @MohammadAbuShady сказал и не пишете все внутри вашего выбора. Создайте вспомогательный метод, напишите код внутри него и вызовите этот вспомогательный метод в своем выборе – Mandeep

ответ

0

Предполагая, что ваши страны находятся в массиве, во-первых вы лучше сделать полный расчет в контроллере

@total_users = @countries.inject{|total,country| total+= country.users.count} 

Или, если вы можете это сделать из модели непосредственно, что было бы слишком хорошо, как User.count или что-то

Тогда в представлении

f.select :country_sel, @countries.collect{|country| ["#{country.name} (#{country.users.count.to_s})", country.id] }, selected: @country_sel, include_blank: "All (#{total_users})" 
+0

Это выглядит определенно намного лучше, чем то, что у меня есть сейчас с картой. И этот тег include_blank, который я не знал о его существовании, вероятно, является ключом ко всем моим головным болям. Я попробую и дам вам знать. Также Джей прав. Спасибо всем – user3777245

+0

Этот последний метод country.users обязывает меня создавать дополнительную таблицу для страны/пользователей и связывать их. Моя база данных теперь заключается в том, что я храню все в таблице пользователей, включая страны и города. И у меня есть одна отдельная таблица для стран как источник для выбора. И, наконец, он должен был бы учитываться и отдельно в базе данных. Но я создам область для запроса в модели и не считая пользователей в представлении, но в контроллере. Включите его в один хэш и перечислите его в представлении. Большое спасибо :) – user3777245

+0

не могли бы вы объяснить структуру таблицы больше, какие имена таблиц и как вы связываете объекты вместе –

0

Это, вероятно, не ответ, который вы ищете, но короткий ответ «нет». Ваш взгляд не должен быть таким умным. Создайте свой список стран и подсчитайте в своем контроллере и передайте их в представление. Затем ваш f.select становится просто вопросом объединения имени страны (включая страну мета-страны) с количеством пользователей.

В дополнение к упрощению вашего вида, это открывает возможности сделать ваш код намного более эффективным, используя group, а не отдельные запросы для каждой страны.

Смежные вопросы