在我的申请中,如果 ,则Annotations
被视为“已接受”:
我的问题是如何使用单个数据库查询查找所有已接受的解释。基本上我正在寻找数据库驱动的
版本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
有效,但这会使查询速度过慢
答案 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"]
那更快吗?