使用Searchkick搜索has_many关联

时间:2018-12-20 21:41:47

标签: ruby-on-rails elasticsearch searchkick

我正在尝试为我的应用程序构建搜索功能,并且在能够搜索has_many关联方面遇到了一些问题。我希望进行设置,以便用户仅看到他们有权访问的项目。

在我的用户模型中,我有:

class User < ApplicationRecord
    searchkick
    has_many :items, -> (user) { unscope(:where).where("(consumer_type = ? and consumer_id = ?))", 'User', user.id) }, fully_load: false, dependent: :destroy

    # not sure if this is helpful, was messing around with this
    def search_data
        {
            name: items.name
        }
    end
end

然后在我的商品模型中,我拥有:

class Item < ApplicationRecord
    belongs_to :consumable, polymorphic: true
    belongs_to :consumer, polymorphic: true
end

然后,我还有两个属于Item的模型“ Book”和“ Camera”。我需要能够在我的控制器中运行查询,例如:

@results = current_user.items.search('Query')

...,以便它返回与搜索查询匹配的Book和Camera结果。 我阅读了Searchkick文档的Personalized Results部分,但根本无法使它工作。 有任何有用的提示,还是有人实现了与特定用户类似的范围界定结果?

1 个答案:

答案 0 :(得分:0)

@results = current_user.items.search('Query')

不可能这样搜索。如果是这样,它将影响性能以从两个数据源查询并与结果集相交。因此,请从项目末尾开始,并在该模型中包含用户信息。

class Item
 searchkick word_middle: %i[name]
 def search_data
   {
     consumer_type: consumer.class.to_s
     consumer_id: consumer.id.to_s
     name: self.name
   }
 end
end

options = {where: [{consumer_type: 'User', consumer_id: current_user.id.to_s}]}
results = Item.search 'query', options