Rails / Ruby delete_if

时间:2010-10-15 18:10:46

标签: ruby-on-rails

我有一个嵌套在我的表单中的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中,生成一个空白的选择选项。反正有没有摆脱选择选项及其价值?我甚至做得对吗?

提前感谢您的所有帮助!

4 个答案:

答案 0 :(得分:3)

您可以使用收集和拒绝来执行此操作。

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

不确定如何使用just。

答案 1 :(得分:3)

我意识到这已经有一年了,但为了未来的googlers ...

使用命名范围可能会更好,而不是内联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]})

这更容易阅读,更具表现力,并且不依赖于某些神奇的数据库ID。

干杯!

(PS:另外,您可能需要考虑更新架构,以便db列的名称不会与它的值混淆。我可以建议使用language.name,而不是language.english吗?)

答案 2 :(得分:1)

看起来您的选择实际上是返回一个空数组作为第一个元素。首先尝试拔出不需要的选项:

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

答案 3 :(得分:0)

感谢回复家伙们!我最终做的是在我的查询中处理它

代码:

<%= 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 %>

数据库中的第一行总是相同的,所以在查询中这很容易做到......虽然上面的建议将来会派上用场!再次感谢!