【问题标题】:Access attribute in Active Record 'through' association objectActive Record 'through' 关联对象中的访问属性
【发布时间】:2015-03-03 17:05:39
【问题描述】:

我有两个类,UserProduct 在“多对多”关联中,使用类 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 有一个名为 role 的属性,我想用它来限定用户-产品关联。

关联工作正常,但我不知道在创建关联后如何访问role 属性。例如,如果我这样做:

user.products << product

如何访问刚刚创建的 prole 对象中的属性?

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

这可能吗?有什么提示吗?

TIA。

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

prole = Prole.find_by user_id: user.id, product_id: product.id

甚至更好

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

【问题讨论】:

  • 不完全清楚您想“从哪里”访问role 属性。你能提供一些你想要实现的伪代码吗?
  • 您能告诉我们您尝试过哪些不起作用的方法吗?
  • 好的,我希望我的问题更清楚了。

标签: ruby activerecord


【解决方案1】:

经过一些测试,看起来最简单的方法是专门获取刚刚创建的 Prole 对象,是通过直接针对 Prole 模型的两个外键进行查询,正如您可能的答案中所建议的那样。

Prole.find_by(user_id: user.id, product_id: product.id)

如果您希望它作为user 对象上的关联,您可以使用includes 方法进行预加载,但它仍会为相关user 加载每个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 } 

有关更多信息,请参阅this answer。但看起来你可能的答案是最干净的方法。

【讨论】:

  • 这对我不起作用,但它确实给了我一个想法,我已将其作为可能的答案添加到我的问题中。
  • 我会将此标记为答案,因为它让我找到了一个有用的解决方案。谢谢!
  • 是的,你是对的,看起来如果你在 Prole 对象之后,你将不得不从该模型开始并从那里查询,否则你将不得不迭代通过一个协会。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多