0

我想检索community_topics包含or or or的所有search keyword内容community_topics.titlecommunity_topics.bodycomments.body

但是下面的这段代码检索并显示了一堆两倍、三倍或更多!记录:(我只希望它们作为单个记录。我该怎么办?

@community_topics = CommunityTopic.joins(:community, :comment_threads).merge(Community.not_deleted).where('community_topics.title like ? OR community_topics.body like ? OR comments.body like ?', "%"+params[:search]+"%", "%"+params[:search]+"%", "%"+params[:search]+"%").order('last_active_at DESC').page(params[:page]).per(10)
4

1 回答 1

1

我会使用诸如:

@community_topics = CommunityTopic.joins(:community, :comment_threads)
                    .merge(Community.not_deleted)
                    .where('community_topics.title like :term 
                            OR community_topics.body like :term 
                            OR comments.body like :term', 
                            term: "%#{params[:search]}%")
                    .order('last_active_at DESC')
                    .uniq.page(params[:page]).per(10)

但是,查询过于复杂。为什么Community.not_deleted要合并?你为什么要传入pageand per?这是在控制器中实现的吗?如果是这样,请提取到您的模型中。创建相关的范围和方法。这是一个示例(未经测试):

模型

model CommunityTopic

  scope :latest_active, order('last_active_at DESC')
  scope :eager, joins(:community, :comment_threads).merge(Community.not_deleted)

  def self.search(term)
    eager.where('community_topics.title like :term 
                 OR community_topics.body like :term 
                 OR comments.body like :term', 
                 term: "%#{term}%").uniq
  end

end

控制器

@community_topics = CommunityTopic.latest_active.search(params[:search]).page(params[:page]).per(10)

这只是一个粗略的例子。如果您可以解释为什么要使用Community.not_deleted合并,则可能会清除它。您能否在上面生成的实际 sql 查询中添加详细信息?

于 2013-10-26T06:59:40.357 回答