我正在尝试为我的应用程序构建搜索功能,并且在能够搜索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部分,但根本无法使它工作。 有任何有用的提示,还是有人实现了与特定用户类似的范围界定结果?
答案 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