从Rails中的多个表中选择 - 有多个“文章”到[table_1,table_2]?

时间:2010-12-31 00:34:11

标签: ruby-on-rails

我遇到的情况是我需要获得与articles到2个表绑定的所有User

  1. article_access:授予用户查看文章的权限
  2. article_favorites:公开文章,用户都喜欢这些
  3. 所以在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调用吗?

1 个答案:

答案 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为参数。