基于多对多关系的复杂过滤

时间:2010-08-05 01:06:40

标签: ruby-on-rails

在我的申请中,如果 ,则Annotations被视为“已接受”:

  1. 他们已被明确标记为“已接受”(即他们的州=='已接受')
  2. 他们最后由具有“编辑”角色的用户更新
  3. 我的问题是如何使用单个数据库查询查找所有已接受的解释。基本上我正在寻找数据库驱动的

    版本
    Annotation.all.select do |a|
      a.last_updated_by.roles.map(&:name).include?('editor') or a.state == 'accepted'
    end
    

    我的第一次尝试是

    Annotation.all(:joins => {:last_updated_by => :roles}, :conditions => ['roles.name = ? or annotations.state = ?', 'editor', 'accepted'])
    

    但是这会返回一堆重复的记录(添加.uniq使其工作)

    :joins更改为:include有效,但这会使查询速度过慢

1 个答案:

答案 0 :(得分:1)

你的第一次尝试的结果是错误还是他们只需要一个“.uniq”? 你试过吗

:include => {:last_updated_by => [:roles]}

而不是加入?

或进行两次查询

@ids = Editor.all(:conditions => ["role = 'editor'"], :select => ["id"]).map{|e|e.id}
Annotation.all(:conditions => ["last_updated_by in (?) or state = ?", @ids.join(","), "accepted"]

那更快吗?