简体   繁体   中英

Access attribute in Active Record 'through' association object

I have two classes, User and Product in a 'many-to-many through' association, using the class Prole (for product role).

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 has an attribute called role which I'd like to use to qualify the user-product association.

The association works fine, but I can't figure out how to access the role attribute after creating the association. For example, if I do:

user.products << product

how can I access the attribute in the prole object just created?

I guess I could iterate through the prole objects and find the correct one, but I'm hoping there's a cleaner way.

Is this possible? Any hints?

TIA.

I was hoping for something a little more direct, but here's a POSSIBLE ANSWER:

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

or even better

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

After some testing, it looks like the easiest way to grab specifically the Prole object that was just created is by querying by the two foreign keys directly against the Prole model, as suggested in your possible answer.

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

If you want it as an association on the user object, you could use the includes approach to do eager loading, but it will still load every prole for the user in question

# 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 } 

See this answer for more info on that. But it looks like your possible answer is the cleanest way.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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