【问题标题】:sunspot search on a has many association太阳黑子搜索有很多关联
【发布时间】:2015-01-23 13:13:14
【问题描述】:

我不明白如何使用 sunspot 进行搜索以处理 has_many 关联。用户从 select_tag 字段中选择技能,结果返回与技能 ID 匹配的记录。

为了记录,当我按下搜索按钮时,我得到了这个:

SOLR Request (294.1ms)  [ path=select parameters={fq: ["type:User"], q: ["4"], fl: "* score", qf: "", defType: "edismax", start: 0, rows: 30} ]

q: ["4"] 提到了数字 4,这是我搜索的技能的 ID。当我想拿回一些东西时,我没有得到任何结果。当我不带参数提交时,我确实让所有用户返回结果。

到目前为止我所做的和想出的可以在下面找到。对于正确方向的任何提示或帮助,我们将不胜感激。

(如果您需要任何其他信息,请告诉我,我会立即添加)

我的结构如下:

在用户模型中 (user.rb)

  has_many :user_skills, dependent: :destroy
  has_many :skills, through: :user_skills

  searchable do
    integer :skill_ids, :multiple => true do
      skills.map(&:id)
    end
  end

在技能模型中 (skill.rb)

  belongs_to :user
  has_many :user_skills
  has_many :users, through: :user_skills

  searchable do
    integer :id, :multiple => true
  end

数据库架构:

t.string   "name"
t.string   "category"
t.string   "slug"

在 User_skills 模型中 (user_skill.rb)

  belongs_to :user
  belongs_to :skill

数据库架构:

t.integer "user_id"
t.integer "skill_id"

在我的搜索控制器中,我有以下代码段:

@search = Sunspot.search(User) do
  fulltext params[:s_skills]
end

@users = @search.results

params[:s_skills] 是从 select_tag 中提取的技能 ID:

<%= select_tag :s_skills, options_for_select(Skill.all.collect{|e| [e.name,e.id]}, skills), {:id => 'e2', :multiple => true, :placeholder => "Input skills", class: "input-search2" } %>

获取技能名称并返回其 ID。

【问题讨论】:

    标签: ruby-on-rails sunspot


    【解决方案1】:

    您实际上并未在已编入索引的 skill_ids 字段中进行搜索。

    您必须添加如下内容:

    User.search do
       fulltext params[:free_text]   #<-- YOU DON'T NEED THIS, PROBABLY?
       with(:skill_ids, params[:s_skills]) if params[:s_skills]
    end
    

    【讨论】:

    • 感谢您的帮助,但它确实向我显示了与任一 id 匹配的记录。例如,如果我搜索 Ruby 和 Java,当我想查看同时具有 Ruby 和 Java 技能的用户时,它会显示具有 Ruby 或 Java 作为技能的用户。有没有办法调整这个?
    • 已修复。我只是使用“all_of”。谢谢一百万
    猜你喜欢
    • 2014-05-30
    • 2012-07-06
    • 2015-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-29
    • 1970-01-01
    相关资源
    最近更新 更多