从has_many:through中的join-table访问数据,防止其他数据加载

时间:2015-01-21 11:05:55

标签: mysql ruby-on-rails-4 activerecord

Rails 4.1.7

我有3个模特。

# Report
class Report < ActiveRecord::Base
  has_many :computed_values, dependent: :destroy
  has_many :settlements, through: :computed_values
end

# ComputedValue
class ComputedValue < ActiveRecord::Base
  belongs_to :report
  belongs_to :settlement
end

# Settlement
class Settlement < ActiveRecord::Base
  has_many :computed_values
  has_many :reports, through: :computed_values
end

ComputedValue有一个属性distance

我希望得到这样的建筑作品:Report.first.settlements.first.distance ComputedValue.find(report_id: Report.first.id, settlement_id: Report.first.settlements.first.id).distance

是否有任何优雅而快速的方法可以实现这一目标?

当我呼叫Report.first.settlements.first时,Rails已经加载了第一次报告的记录,第一次结算和来自联接表computed_values的记录。 如何防止从computed_values第二次加载以查找值并使用已加载记录中的数据?

1 个答案:

答案 0 :(得分:0)

好的,我找到了解决方案。

# Report
has_many :settlements, -> {select("settlements.*, computed_values.distance AS distance")},
          through: :computed_values

之后,Report.first.settlements.first.distance完美无缺!