Ruby 关于 Rails 3 多个关联

Ruby on Rails 3 Multiple Associations

我有以下关联:

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

现在我需要补充一句赞美class。一个用户可以称赞另一个用户(所以我有一个 user_from_id 和一个 user_to_id)。可以为购物请求 and/or 推荐给予赞美;并且没有限制(对于任意数量的购物请求和推荐,同一用户或其他用户可以给予用户多次赞美)。

我确实知道要使 Compliment 多态化,但不确定相对于 users/shopping requests/recommendations 设置它的最佳方式是什么。

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

那么什么是建立赞美关联的最佳方式class?

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

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 都知道它的 User,所以保存 complemented-User 是多余的。您可以选择添加行...

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 (to get all that user's compliments for a particular shopping request;

因为您编写的是 User 的实例方法,我们可以假设 User 是已知的。但是,由于用户可以有 多个 ShoppingRequests,因此不可能通过您所写的内容来磨练一个特定的请求以显示对它的赞美。