Rails / Ruby delete_if - PullRequest
       1

Rails / Ruby delete_if

1 голос
/ 15 октября 2010

У меня есть тег select, вложенный в мою форму, и мне нужно удалить элемент из моего массива options_for_select, если он равен слову English

код:

<%= fields_for :users_languages do |u| %>
  <div class="field">
    <%= u.label :Assign_Languages %><br />
    <%= select_tag :language_id, 
      options_for_select(Language.all.collect {|lang|
        [lang.english, lang.id].delete_if {lang.english == "English"}
        }, @lang_list),
        :multiple => true,
        :prompt => 'Select Language' %>
  </div>
<% end %>

Проблема: Приведенный выше код работает нормально, но по какой-то причине первый параметр все еще отображается в mutli-select, создавая пустой параметр select. Есть ли вообще способ избавиться от опции выбора и ее значения? Я даже делаю это правильно?

Заранее всем спасибо за помощь!

Ответы [ 4 ]

3 голосов
/ 03 октября 2011

Я понимаю, что это год, но ради будущих гуглеров ...

Вместо встраивания в SQL, вам может быть лучше с именованной областью действия:

scope :not_english, where("english != 'English'") # Rails 3

или

named_scope :not_english, :conditions => "english != 'English'" # Rails 2

, что позволит вам:

options_for_select(Language.not_english.collect {|lang| [lang.english, lang.id]})

Это легче для чтения, более выразительное и не зависит от некоторого магического идентификатора базы данных.

Приветствия!

(PS: Кроме того, вы можете подумать об обновлении схемы, чтобы имя столбца db не путалось с его значением. Могу ли я предложить language.name, а не language.english?)

3 голосов
/ 15 октября 2010

Вы можете сделать это, используя сбор и отклонение.

Language.all.collect { |lang| [lang.english, lang.id] }.reject { |(lang, id)| lang == 'English' }

Не знаете, как это сделать, используя только сбор.

1 голос
/ 15 октября 2010

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

Language.all.reject {|lang| lang.english == "English}.collect {|lang| [lang.english, lang.id]}
0 голосов
/ 15 октября 2010

Спасибо за ответ, ребята! То, что я закончил, было обработать это в моем запросе

код:

<%= fields_for :users_languages do |u| %>
        <div class="field">
            <%= u.label :Assign_Languages %><br />
            <%= select_tag :language_id, options_for_select(Language.find(:all, :conditions => "id != 1").collect {|lang| [lang.english, lang.id]}, @lang_list),:multiple => true, :prompt => 'Select Language' %>
         </div>
    <% end %>

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...