繁体   English   中英

Rails mutlipe has_many通过不同的模型到单个模型

[英]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_userssaving_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM