【问题标题】:Ransack search multiple classesRansack搜索多个类
【发布时间】:2018-09-23 14:23:15
【问题描述】:

我有一个使用 Ransack 构建的有效搜索表单,其中包含两个单独的搜索字段,用于两个不同的类,如下所示:

<%= search_form_for @q do |f| %>
 <%= f.label :tags_id_in, 'Tags' %>
 <%= f.select :tags_id_in, Tag.all.map{ |u| [u.name, u.id] }, { include_blank: "Tags" } %>

 <%= f.label :sector_id_eq, 'Sector' %>
 <%= f.select :sector_id_eq, Sector.all.map { |w| [w.name, w.id] }, {include_blank: 'Any'} %>

 <%= f.submit "Search" %>           
<% end %>

这些类中的每一个都链接到一个公司类

class Company < ApplicationRecord
 belongs_to :sector

 has_many :company_tags
 has_many :tags, through: :company_tags
 accepts_nested_attributes_for :company_tags
end

我正在尝试将两个选择字段合并为一个。到目前为止,我可以像这样构建视图:

<% combined = Sector.all + Tag.all %>
<%= f.select :combined, combined.map { |w| [w.name, w.id] }.sort, {include_blank: 'Any'} %>

虽然上述方法仅适用于显示单个搜索表单,但它没有任何功能。有人能帮忙吗?提前致谢。

【问题讨论】:

  • 你能澄清你想要达到的目标吗?据我了解,您想根据 id 在 2 个不同的模型上进行搜索。如果将它们结合起来,你怎么知道哪个模型代表了所选的 id?

标签: ruby-on-rails ruby ruby-on-rails-5 ransack


【解决方案1】:

万岁,兰萨克。 2013年的这个答案似乎仍然有效: Search multiple models at once with Ransack

但如果你喜欢冒险,不妨试试这个: https://github.com/activerecord-hackery/ransack/issues/131

您可以通过 :associations 选项将关联的名称传递给#attribute_select,将关联的列/ransackers 添加到属性列表中。

【讨论】:

    【解决方案2】:

    我不熟悉洗劫,但也许值得创建一个新的替身类?只是一个 PORO (plain ol' ruby​​ object) 用于视图和模型的中间人,使用 ransack 进行查询,而不是直接从表单中调用它们。您也可以在该对象中构建标签列表。

    您的观点中有很多逻辑,很多人不赞成将 ActiveRecord 查询放在那里。一个表单对象可以解决这个问题,并使您的控制器也很简单。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-29
      • 1970-01-01
      • 2018-11-17
      • 2013-05-22
      • 2013-03-02
      • 2015-02-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多