has_many :through : Comment accédez-vous à la table de jointure attributs?

J'ai les modèles suivants dans les Rails 4 avec un simple has_many :par l'association:

class Model < ActiveRecord::Base
  has_many :model_options
  has_many :options, through: :model_options
end

class Option < ActiveRecord::Base
  has_many :model_options
  has_many :models, through: :model_options
end

class ModelOption < ActiveRecord::Base
  belongs_to :model
  belongs_to :option
end

Je veux être en mesure d'effectuer une itération sur un Modèle de l'instance Options:

  model = Model.find.first
  model.options.each {}

et l'accès aux attributs sur la table de jointure.

Dans Rails 3, vous pourriez faire ceci:

class Model < ActiveRecord::Base
  has_many :model_options
  has_many :options, through: :model_options , select: 'options.*, model_options.*'
end

Mais de sélectionner: est obsolète et ce produit une dépréciation d'avertissement.

Cela dit, le SQL généré contient la table de liaison de données:

SELECT options.*, model_options.* FROM "options"
INNER JOIN "model_options" ON "options"."id" = "model_options"."option_id"
WHERE "model_options"."model_id" = $1 ORDER BY "options".name ASC  [["model_id", 1]]

Mais la collection retournée par l'AR du modèle.options supprime le lien de la table de données.

Pour supprimer les désapprobations avertissement dans les Rails 4, et encore produire le même SQL, j'ai fait ça:

class Model < ActiveRecord::Base
  has_many :model_options
  has_many :options, -> { select('options.*, model_options.*') }, through: :model_options
end

Ainsi, la requête est correcte, mais j'ai du mal à trouver le bon moyen pour accéder à la table de liaison de données.

J'ai essayé de différentes façons:

 model options
 model.options.joins(:model_options)
 model.options.select('options.*, model_options.*')
 model.model_options.joins(:option)
 ...

Aucun inclure la jointure de la table de données.

Grâce.

  • Ne Optionmodèle modèle faire quelque chose de plus à l'extérieur de deux identifiants?
  • Oui, Optionmodèle a un certain nombre d'attributs sur elle. Par exemple, le prix, d'où une option est le prix variera selon le modèle.
  • J'ai le même problème. Comment avez-vous le résoudre?
  • J'ai trouvé que la table de jointure attributs sont accessibles de manière transparente comme model.price (où price comme l'attribut de la Optionmodèle) après avoir spécifié le has_many ... select() déclaration à inclure.
InformationsquelleAutor auxbuss | 2013-09-14