从rails 3.2中的数组中过滤nil和空值

时间:2013-07-29 12:00:30

标签: ruby-on-rails-3 postgresql activerecord

我有一个名为Materials的表,我创建了一个搜索表单。在表单中,我想要包含搜索选项名称的选择框。因此,例如,如果您想按主题搜索,我想要与每个主题之一下拉。我有这个有效的代码:

@subject = Material.unscoped.select(:subject).where("materials.subject IS NOT NULL
and materials.subject != '' ").uniq

这给了我想要的以下表单助手:

<%= select_tag "subject", options_from_collection_for_select(@subject, "subject", 
"subject"), :include_blank => true, :class => "input_field" %>

但是 - 我现在只想从共享的材料中选择那些主题。所以我选择使用共享材料:

@shared = Material.where(:status => 'shared')

然后运行此代码:

@subject = @shared.unscoped.select(:subject).where("@shared.subject IS NOT NULL
and @shared.subject != '' ").uniq

哪个不起作用。我认为这是因为sql代码无法理解@shared对象。但是怎么做呢?

注意:

我尝试使用:

@subject = @shared.uniq.pluck(:subject).reject! { |s| s.empty? }

这给出了一个正确的字段数组,但是这对于options_from_collection_for_select不起作用。

2 个答案:

答案 0 :(得分:1)

试试这个

@subject = Material.unscoped.select(:subject).where("subject IS NOT NULL and materials.subject != '' and status = 'shared'").uniq 

答案 1 :(得分:1)

您可以为shared查询创建范围,如下所示:

scope :shared, where(:status => 'shared')

然后你可以根据自己的喜好链接ActiveRecord方法:

@subject = Material.select(:subject).where("materials.subject IS NOT NULL 
  AND materials.subject != '' ").shared.uniq

有关范围的更多信息:http://guides.rubyonrails.org/active_record_querying.html#scopes