我遇到的情况是我需要获得与articles
到2个表绑定的所有User
:
所以在ActiveRecord中你可能会这样:
class User < ActiveRecord::Base
has_many :article_access_tokens
has_many :article_favorites
def articles
unless @articles
ids = article_access_tokens.all(:select => "article_id").map(&:article_id) + article_favorites.all(:select => "article_id").map(&:article_id)
@articles = Article.send(:scoped, :conditions => {:id => ids.uniq})
end
@articles
end
end
这基本上给了我一个articles
关联,它从两个单独的表中读取。问题是,正确的方式是做什么的?
我可以以某种方式进行1次SQL SELECT调用吗?
答案 0 :(得分:1)
是的,你可以写一个连接来做这个,比如:
Article.all(:joins => "left join article_access_tokens on (article_access_tokens.article_id = articles.id and article_access_tokens.user_id = #{self.id})
left join article_favourites on (article_favourites.article_id = articles.id and article_favourites.user_id = #{self.id})",
:conditions => "article_favourites.id is not null or article_access_tokens.id is not null")
需要成为一个左连接,因为一篇文章可能在两个表中的任何一个表中都没有(条件子句捕获它不存在的情况)。
如果您对article_favourites article_id / user_id和article_access_tokens article_id / user_id没有唯一约束,则最终可能会出现重复结果,如果是这种情况,最好修复数据并添加唯一约束而不是做一个截然不同的。
为了清洁,你可能有一个has_many:authorized_articles或Article模型的范围,它以user_id为参数。