Ruby 活动记录“通过”关联对象中的访问属性

Ruby 活动记录“通过”关联对象中的访问属性,ruby,activerecord,Ruby,Activerecord,我有两个类,用户和产品在“多对多通过”关联中,使用类Prole作为产品角色 class User < ActiveRecord::Base has_many :proles has_many :products, through: :proles end class Product < ActiveRecord::Base has_many :proles has_many :users, through: :proles end class Prole <

我有两个类,用户和产品在“多对多通过”关联中,使用类Prole作为产品角色

class User < ActiveRecord::Base
  has_many :proles
  has_many :products, through: :proles
end

class Product < ActiveRecord::Base
  has_many :proles
  has_many :users, through: :proles
end

class Prole < ActiveRecord::Base
  # has an attribute called 'role'
end
如何访问刚刚创建的prole对象中的属性

我想我可以遍历prole对象并找到正确的对象,但我希望有一种更干净的方法

这可能吗?有什么提示吗

蒂亚

我希望有更直接一点的东西,但这里有一个 可能的答案:

prole = Prole.find_by user_id: user.id, product_id: product.id
甚至更好

prole = user.proles.where("product_id = #{product.id}")

经过一些测试后,看起来最容易抓取刚刚创建的Prole对象的方法是通过两个外键直接查询Prole模型,如您可能的答案所示

Prole.find_by(user_id: user.id, product_id: product.id)
如果希望将其作为用户对象上的关联,可以使用includes方法进行快速加载,但它仍然会为相关用户加载每个prole

# specifying proles: {product_id: product.id} in the where clause here 
# only limits users retrieved, not proles
user = User.includes(:proles).where(id: user.id) 
# eager-loaded prole array
user.proles.find { |prole| prole.product_id == product.id } 

请参阅以了解更多信息。但看起来您可能的答案是最简洁的。

从何处访问角色属性并不完全清楚。你能提供一些你想要实现的伪代码吗?你能告诉我们你尝试了哪些不起作用的东西吗?好吧,我希望我已经编辑了,让我的问题更清楚。那对我来说不起作用,但它确实给了我一个想法,我把它作为可能的答案添加到了我的问题中。我将把它标记为答案,因为它让我走上了一条有用的解决方案的轨道。谢谢是的,你是对的,看起来如果你在寻找Prole对象,你就必须从这个模型开始并从那里开始查询,否则你就必须遍历一个关联。
# specifying proles: {product_id: product.id} in the where clause here 
# only limits users retrieved, not proles
user = User.includes(:proles).where(id: user.id) 
# eager-loaded prole array
user.proles.find { |prole| prole.product_id == product.id }