次のモデルがあるとします。
class Category < ActiveRecord::Base
has_one :current_heat, class_name: 'Heat'
has_many :scores, :through => :current_heat
end
class Heat < ActiveRecord::Base
belongs_to :category
has_many :scores
end
class Score < ActiveRecord::Base
belongs_to :heat
end
驚いたことに、Category.first.scores
ActiveRecord を呼び出すと、次のクエリが生成されます。
SELECT `categories`.* FROM `categories` LIMIT 1
SELECT * FROM `scores` INNER JOIN `heats` ON `scores`.`heat_id` = `heats`.`id` WHERE `heats`.`category_id` = 1
上記のクエリは、 の has_one の性質を無視していますCategory#current_heat
。私はもっと次のようなものを期待していたでしょう:
SELECT `categories`.* FROM `categories` LIMIT 1
SELECT `heats`.* FROM `heats` WHERE `heats`.`category_id` = 1 LIMIT 1
SELECT * FROM `scores` WHERE `scores`.`heat_id` = 6
を使用してルートから has_one 関連付けを明示的にトラバースした場合にのみ生成されますCategory.first.current_heat.scores
。
あたかも ActiveRecord が黙って私の has_one を has_many として扱っているかのようです。誰かが私にこの振る舞いを説明できますか? それを行うためのエレガントな回避策または「正しい方法」はありますか?