1

我有一个带有Content模型的 Rails 应用程序。内容模型有许多STI子模型,例如AnnouncementStoryFAQ等。我需要能够通过Sunspot为每个子独立和作为一个组查询 Solr。

这是内容模型中太阳黑子搜索的当前实现。它为隐藏和发布设置默认值,因此 Solr 仅返回活动内容并接受 ablock以允许更远的搜索参数:

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))。

有没有办法反映类方法的类,还是必须在运行时动态生成该方法才能预先定义调用类?

4

1 回答 1

0

很简单,只需传递实例类型而不是Content. 将函数的第一行更改为:

search = Sunspot.new_search(self)

Content如果您调用方法 byContent.search_for并且Announcement如果调用 by , self 将保持在哪里Announcement.search_for。就是这样!

于 2013-09-19T06:08:12.413 回答