【问题标题】:Ruby on Rails 3 Multiple AssociationsRuby on Rails 3 多重关联
【发布时间】:2015-06-10 18:48:57
【问题描述】:

我有以下关联:

class User < ActiveRecord::Base
  has_many :shopping_requests
  has_many :recommendations, :through => :shopping_requests
end


class ShoppingRequest < ActiveRecord::Base
  belongs_to :user
  has_many :recommendations
end


class Recommendation < ActiveRecord::Base
  belongs_to :shopping_request
  has_one :user, :through => :shopping_requests
end

现在我需要添加一个 Compliment 类。一个用户可以赞美另一个用户(所以我有一个 user_from_id 和一个 user_to_id)。可以对购物请求和/或推荐给予称赞;并且没有限制(同一用户或其他用户可以针对任意数量的购物请求和推荐对用户进行多次赞美)。

我确实知道使 Compliment 具有多态性,但不确定根据用户/购物请求/推荐进行设置的最佳方法是什么。

我希望能够运行这样的查询:

  • user_to_id.compliments(获取用户的所有赞美);
  • user_to_id.shopping_request.compliments(获取该用户对特定购物请求的所有赞美;
  • user_to_id.recommendation.compliments(获取该用户对特定推荐的所有赞美;对于此特定查询,运行 user_to_id.shopping_request.recommendation.compliments 也可以);
  • user_from_id.compliments(获取用户对另一个用户的所有赞美);
  • user_from_id.shopping_request.compliments(获取该用户对特定购物请求的所有赞美)等......

那么为 Compliment 类设置关联的最佳方式是什么?

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 associations polymorphic-associations


    【解决方案1】:

    这是我的第一次挥杆。您已经编写的代码有效,我没有在这里复制它。

    class User < ActiveRecord::Base
      ...
      has_many :outgoing_compliments, class_name: "Compliment", foreign_key: "from_id"
      has_many :incoming_request_compliments, through: :shopping_requests, source: compliments
      has_many :incoming_recommendation_compliments, through: :recommendations, source: compliments
      ...
    end
    
    
    class ShoppingRequest < ActiveRecord::Base
      ...
      has_many compliments, as: :compliment able
      ...
    end
    
    
    class Recommendation < ActiveRecord::Base
      ...
      has_many compliments, as: :complimentable
      ...
    end
    
    class Compliment < ActiveRecord::Base
      belongs_to :complimentable, polymorphic: true
      #relies on two DB columns, complimentable_id and complimentable_type
    
      belongs_to :complimenter, class_name: "User", foreign_key: "from_id"
    end
    

    按照您的定义,我对您的数据库进行了一次更改。 Compliment 知道它属于哪个 Complimentable,并且由于每个 Complimentable 都知道它的用户,因此保存被补充的用户是多余的。您可以选择添加行...

    class Compliment
      belongs_to :complimented, class_name: "User", foreign_key: "from_id"
    
    class User
      has_many :incoming_compliments, class_name: "Compliment", foreign_key: "to_id"
    

    ...但我想我不会。

    这些是您需要创建的关联。但是,您想要的一些方法调用不够具体。一个例子:

    user_to_id.shopping_request.compliments(获取该用户的所有 对特定购物请求的赞美;

    由于您编写的是 User 的实例方法,我们可以假设 User 是已知的。但是,由于用户可以有 许多 个 ShoppingRequest,因此不可能通过您所写的内容来细化一个特定的请求以显示 Compliments。

    【讨论】:

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