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作为参数