我在 Rails 4 中有以下模型,带有一个简单的 has_many :through 关联:
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
我希望能够遍历模型实例的选项:
  model = Model.find.first
  model.options.each {}
并访问连接表上的属性。
在 Rails 3 中,您可以这样做:
class Model < ActiveRecord::Base
  has_many :model_options
  has_many :options, through: :model_options , select: 'options.*, model_options.*'
end
但是 select: 已弃用,这会产生弃用警告。
也就是说,生成的 SQL 包含链接表数据:
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]]
但是 AR 从 model.options 返回的集合会删除链接表数据。
为了删除 Rails 4 中的弃用警告,并且仍然产生相同的 SQL,我这样做了:
class Model < ActiveRecord::Base
  has_many :model_options
  has_many :options, -> { select('options.*, model_options.*') }, through: :model_options
end
所以,查询是正确的,但我正在努力寻找访问链接表数据的正确方法。
我尝试了各种方法:
 model options
 model.options.joins(:model_options)
 model.options.select('options.*, model_options.*')
 model.model_options.joins(:option)
 ...
无包含连接表数据。
谢谢。