我有一个名为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不起作用。
答案 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