mysql - Rails 多个 has_many 通过不同的模型到单个模型

标签 mysql ruby-on-rails

我是 rails 的新手,我需要一些帮助来构建 rails 模型。 我有四个模型 User、Product、UserSavedProduct、likedProduct。

用户可以通过usersavedproducts和liked products拥有很多产品,这些是我的模型。这是写它们的正确方法吗?如果是这样如何获得所有保存的产品,单个用户喜欢的产品,否则你能给我指明正确的方向吗。

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 _products, :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, :after_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, :saved_product_ids, :saved_products=, :saved_product_ids=, :product_likes, :product_like_ids, :product_likes=, :product_like_ids=, :liked_products, :liked_product_ids, :liked_products=, :liked_product_ids=]

最佳答案

您遇到的主要问题是您的 Product 模型 - 您有多个 :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

关于mysql - Rails 多个 has_many 通过不同的模型到单个模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26798531/

相关文章:

mysql - 如果第二个表满足要求,则从多个表中选择数据

mysql - 在关系数据库中存储和引用不可变的有序列表

ruby-on-rails - Paypal自适应支付不再接受新申请?

mysql - 如何排序一个表与 Rails 4 中的另一个表有很多关系?

ruby-on-rails - 启动 Rails 时定义 "current time"?

ruby-on-rails - Elastic Beanstalk - Rails - git deploy 和部署钩子(Hook)

ruby-on-rails - 将所有设计 Controller 配置为使用不同的布局?

mysql - 如何从两个表中进行选择?

jquery - Perl使用Jquery显示html onclick循环数据库插入

mysql - 多选查询返回的行数少于预期