Ruby on rails 从Rails中的多个表中选择-有许多;文章;通过[表1、表2]?
我的情况是,我需要通过两个表获取所有与Ruby on rails 从Rails中的多个表中选择-有许多;文章;通过[表1、表2]?,ruby-on-rails,Ruby On Rails,我的情况是,我需要通过两个表获取所有与用户绑定的文章: article_access:授予用户查看文章的权限 文章收藏:在公开文章中,用户喜欢这些 因此,在ActiveRecord中,您可能会看到: class User < ActiveRecord::Base has_many :article_access_tokens has_many :article_favorites def articles unless @articles ids
用户绑定的文章
:
article_access:授予用户查看文章的权限
文章收藏:在公开文章中,用户喜欢这些
因此,在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
class用户“article\u id”).map(&:article\u id)+article\u收藏夹。全部(:select=>“article\u id”).map(&:article\u id)
@articles=Article.send(:作用域,:条件=>{:id=>ids.uniq})
结束
@文章
结束
结束
这基本上给了我一个文章
关联,它从两个单独的表中读取。问题是,做这件事的正确方法是什么
我是否可以通过某种方式调用1个SQL SELECT来执行此操作?是的,您可以编写一个连接来执行此操作,类似于:
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")
需要是左联接,因为项目可能位于两个表中的任何一个或任何一个表中(conditions子句捕获项目不在任何一个表中的情况)
如果您对article\u Favorites article\u id/用户\u id和article\u access\u tokens article\u id/用户\u id没有唯一约束,则可能会导致重复的结果。如果是这种情况,最好修复数据并添加唯一约束,而不是执行不同的操作
为了保持整洁,您可能有一个has\u many:authorized\u articles,或者在文章模型上有一个作用域,该作用域将用户id作为参数