太阳黑子搜索 Rails 的单表继承



我有一个带有Content模型的Rails应用程序。Content模型有许多STI子模型,如AnnouncementStoryFAQ等。我需要能够通过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。就是这样!

最新更新