假设你有以下型号:轨道3的has_many通过HAS_ONE
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
上面的查询忽略的Category#current_heat
的HAS_ONE性质。我本来期望更多的东西一样:
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。有人可以向我解释这种行为吗?有没有一个优雅的解决方法或“正确的方法”来做到这一点?
肯定会有每个类别超过一排预赛,但其没关系,因为我已经添加了'default_scope顺序(“created_at DESC”)'来加热,以确保任何我谈论热火奇异时间感觉,这是最近的热度。这样,我就可以灵活地谈论当前和历史上的热度。因此,从某种意义上说,它有两个has_many和has_one,这取决于用例。 – mgadda