![](/img/trans.png)
[英]Rails 4: model relationships and indexing for two has_many through models
[英]Rails mutlipe has_many through different models to single model
我是Rails的新手,在构架Rails模型时需要一些帮助。 我有四个模型User,Product,UserSavedProduct,likedProduct。
用户可以通过用户购买的产品和喜欢的产品获得很多产品,这些是我的模型。 这是编写它们的正确方法吗? 如果是这样,如何获取所有保存的产品,喜欢单个用户的产品,还可以为我指出正确的方向。
class User < ActiveRecord::Base
has_many :user_saved_products
has_many :saved_products,:through => :user_saved_products,:source => :products
has_many :product_likes
has_many :products,:through => :product_likes
End
class UserSavedProduct < ActiveRecord::Base
belongs_to :user
belongs_to :product
end
class ProductLike < ActiveRecord::Base
belongs_to :user
belongs_to :product
end
class Product < ActiveRecord::Base
belongs_to :user
has_many :user_saved_products
has_many :users, :through => :user_saved_products
has_many :product_likes
has_many :users,:through => :product_likes
end
当我做User.first.methods.grep(/ product /)
=> [:autosave_associated_records_for_user_saved_products,:validate_associated_records_for_user_saved_products,:before_add_for_user_saved_products,:before_add_for_user_saved_products ?,:before_add_for_user_saved_products =,:after_add_for_user_saved_products,:after_add_for_user_saved_products ?,:after_add_for_user_saved_products =,:before_remove_for_user_saved_products,:before_remove_for_user_saved_products ?,:before_remove_for_user_saved_products =,:after_remove_for_user_saved_products,:after_remove_for_user_saved_products ?,: after_remove_for_user_saved_products =,:autosave_associated_records_for_saved_products,:validate_associated_records_for_saved_products,:before_add_for_saved_products,:before_add_for_saved_products ?,:before_add_for_saved_products =,:after_add_for_saved_products,:after_add_for_saved_products ?,:after_add_for_saved_products =,:before_remove_for_saved_products,:before_remove_for_saved_products ?,:before_remove_for_saved_products =,:after_remove_for_saved_pr oducts,:after_remove_for_saved_products ?,:after_remove_for_saved_products =,:autosave_associated_records_for_product_likes,:validate_associated_records_for_product_likes,:before_add_for_product_likes,:before_add_for_product_likes ?,:before_add_for_product_likes =,:after_add_for_product_likes,:after_add_for_product_likes ?,:after_add_for_product_likes =,:before_remove_for_product_likes,:before_remove_for_product_likes ?,:before_remove_for_product_likes =,: after_remove_for_product_likes,:after_remove_for_product_likes ?,:after_remove_for_product_likes =,:autosave_associated_records_for_liked_products,:validate_associated_records_for_liked_products,:before_add_for_liked_products,:before_add_for_liked_products ?,:before_add_for_liked_products =,:after_add_for_liked_products,:after_add_for_liked_products ?,:after_add_for_liked_products =,:before_remove_for_liked_products,:before_remove_for_liked_products ?,:before_remove_for_liked_products =,: after_remove_for_liked_products,:a fter_remove_for_liked_products ?,:after_remove_for_liked_products =,:user_saved_products,:user_saved_product_ids,:user_saved_products =,:user_saved_product_ids =,:saved_products,s_save_id,slike: Liked_products,:liked_product_ids,:liked_products = 、: liked_product_ids =]
您遇到的主要问题是您的产品模型-您有多个:users
关联。 我会这样设置。
我必须从产品返回用户中选择两个关联名称。 我选择了liking_users
和saving_users
,如果您不喜欢它们,可以重命名。
如果执行此操作,则将ProductLike类重命名为“ UserLikedProduct”,以使其与“ UserSavedProduct”保持一致。 显然,如果您这样做,则需要更改数据库表名称和引用该表的关联。
class User < ActiveRecord::Base
has_many :user_saved_products
has_many :saved_products, :through => :user_saved_products, :class_name => "Product"
has_many :product_likes
has_many :liked_products,:through => :product_likes, :class_name => "Product"
end
class Product < ActiveRecord::Base
has_many :user_saved_products
has_many :saving_users, :through => :user_saved_products, :class_name => "User"
has_many :product_likes
has_many :liking_users, :through => :product_likes, :class_name => "User"
end
class UserSavedProduct < ActiveRecord::Base
belongs_to :user
belongs_to :product
end
class ProductLike < ActiveRecord::Base
belongs_to :user
belongs_to :product
end
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.