我有一个带有Content
模型的Rails应用程序。Content模型有许多STI子模型,如Announcement
、Story
、FAQ
等。我需要能够通过Sunspot独立地并作为一个组为每个子查询Solr。
这是内容模型中Sunspot搜索的当前实现。它设置了隐藏和发布的默认值,因此Solr只返回活动内容,并接受block
以允许进一步的搜索参数:
def self.search_for(&blk)
search = Sunspot.new_search(Content)
search.build(&blk)
search.build do
with :hidden, false
with(:published_at).less_than Time.now
end
search.execute
search
end
此方法非常适用于Content,并将返回Content和所有子模型的结果。我对方法的名称search_for
并不特别兴奋,但我想不出比这更好的了。
我需要能够按子模型进行搜索,即Announcement.search_for()
。我不想把这个方法粘贴到大约10个子模型中,因为默认值在不久的将来会改变。我希望每个子模型都继承这个方法,但搜索子类,而不是Content
(例如Announcement
将按Sunspot.new_search(Announcement)
搜索)。
有没有办法反映类方法的类,或者这个方法必须在运行时动态生成才能预先定义调用类?
非常简单,只需传递实例类型而不是Content
。将函数的第一行更改为:
search = Sunspot.new_search(self)
如果您通过Content.search_for
调用该方法,则self将保持Content
;如果通过Announcement.search_for
调用,则保持Announcement
。就是这样!