太阳黑子Solr:从同一个has_many关联中将多个属性匹配在一起?

时间:2017-03-03 07:24:50

标签: ruby-on-rails solr sunspot

让我们假设我们有两个用户,

用户A ,附:

  • 'Ruby'的技巧和'5'
  • 的experience_years
  • 'HTML'的技巧和'7'
  • 的experience_years

用户B ,附:

  • 'Ruby'的技巧和'2'的experience_years
  • 'HTML'的技巧和'5'
  • 的experience_years

我只想匹配用户A ,即具有5年Ruby经验的用户。

下面的控制器和型号代码与用户A和B都匹配,因为skillexperience_years是单独评估的,并且两个用户都有'Ruby'和'5',只是不在一起。

如何编写控制器(或模型)部件以仅匹配用户A?

模型

class User < ApplicationRecord
  has_many :user_skills

  searchable do
    text :skill do
      user_skills.map { |r| r.skill.name }
    end
    text :experience_years do
      user_skills.pluck(:experience_years)
    end
  end
end

class UserSkill < ApplicationRecord
  belongs_to :user
  belongs_to :skill
end

class Skill < ApplicationRecord
end

控制器

class UsersController < ApplicationController
  def index
    sunspot = User.search do
      fulltext 'Ruby' do
        fields(:skill)
      end
      fulltext '31' do
        fields(:experienceYears)
      end
    end

    @users = sunspot.results
  end
end

1 个答案:

答案 0 :(得分:0)

解决方案是使用动态整数。

模型(可搜索的内部块):

# skill + experienceYears composite field:
dynamic_integer :skill_composite do
  if skills
    skills.inject({}) do |hash, e|
      hash.merge(e.skill.skill_code => e.experience_years)
    end
  end
end

控制器:

with(skill_code).equal_to experience_years

请注意使用skill_code而不是name,这是因为字符串中的空格等特殊字符会导致麻烦。在这种情况下,skill_code是一种参数化的名称值。