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 设置它的最佳方式是什么。
我希望能够 运行 这样的查询:
- user_to_id.compliments(为用户获取所有的赞美);
- user_to_id.shopping_request.compliments(获取用户对特定购物请求的所有赞美;
- user_to_id.recommendation.compliments(获得用户对特定推荐的所有赞美;对于这个特定查询,运行ning user_to_id.shopping_request.recommendation.compliments 也可以);
- user_from_id.compliments(获得一个用户给另一个用户的所有赞美);
- user_from_id.shopping_request.compliments(获取该用户对特定 shopping_request 的所有赞美),等等....
那么什么是建立赞美关联的最佳方式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,因此不可能通过您所写的内容来磨练一个特定的请求以显示对它的赞美。
我有以下关联:
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 设置它的最佳方式是什么。
我希望能够 运行 这样的查询:
- user_to_id.compliments(为用户获取所有的赞美);
- user_to_id.shopping_request.compliments(获取用户对特定购物请求的所有赞美;
- user_to_id.recommendation.compliments(获得用户对特定推荐的所有赞美;对于这个特定查询,运行ning user_to_id.shopping_request.recommendation.compliments 也可以);
- user_from_id.compliments(获得一个用户给另一个用户的所有赞美);
- user_from_id.shopping_request.compliments(获取该用户对特定 shopping_request 的所有赞美),等等....
那么什么是建立赞美关联的最佳方式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,因此不可能通过您所写的内容来磨练一个特定的请求以显示对它的赞美。