【问题标题】:Union of 2 active record relation object in rails 3rails 3中2个活动记录关系对象的联合
【发布时间】:2012-06-30 00:26:45
【问题描述】:

我有一个由类表示的内容模型:content。现在用户可以评价内容评论内容或两者兼而有之。我想找到用户评价评价评价和评价的所有内容。 reviews 表与 content 表具有多对一的关联(意味着可以多次查看内容)。 ratings 表和 content 表之间存在类似的关系。

我想我应该进行单独的查询以查找用户的所有评分内容,然后查找用户的所有评论内容,然后进行联合。但我不知道如何做一个返回活动记录关系的联合。我需要一个关系,因为我想对结果进行分页。

谢谢。

【问题讨论】:

    标签: ruby-on-rails-3 activerecord


    【解决方案1】:

    好的,首先让我们设置您的模型。根据您的解释,我认为您会想要这样的东西:

    class Content < ActiveRecord::Base
      has_many :reviews
      has_many :reviewing_users, :through => :reviews, :class_name => "User"
    
      has_many :ratings
      has_many :rating_users, :through => :ratings, :class_name => "User"
    end
    
    class User < ActiveRecord::Base
      has_many :reviews
      has_many :reviewed_contents, :through => :reviews, :class_name => "Content"
    
      has_many :ratings
      has_many :rated_contents, :through => :ratings, :class_name => "Content"
    end
    
    class Review < ActiveRecord::Base
      belongs_to :content
      belongs_to :user
    end
    
    class Rating < ActiveRecord::Base
      belongs_to :content
      belongs_to :user
    end
    

    然后对于给定的用户,您可以找到他们审查和/或评分的所有内容:

    ( user.reviewed_contents + user.rated_contents ).uniq
    

    【讨论】:

    • 抱歉这么久才回来。但这非常有效。非常感谢。
    • 感谢Robertibiris 指出我的错别字
    【解决方案2】:

    (user.reviewed_contents + user.rated_contents).uniq 返回一个数组,而不是一个关系,所以要小心。您可以通过尝试在 @posts(分页除外)上调用类方法来测试这一点。

    你仍然可以分页。只需使用@posts.paginate,因为will_paginate gem 将paginate 方法添加到数组类。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多