问题描述
假设你有以下型号:
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产生以下疑问:
Surprisingly, when I invoke Category.first.scores
ActiveRecord produces the following queries:
SELECT `categories`.* FROM `categories` LIMIT 1
SELECT * FROM `scores` INNER JOIN `heats` ON `scores`.`heat_id` = `heats`.`id` WHERE `heats`.`category_id` = 1
上面的查询忽略了类别#current_heat
的HAS_ONE性质。我本来期望更多的东西,如:
The above query ignores the has_one nature of Category#current_heat
. I would have expected something more like:
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。有人可以解释这种现象给我?有一种优雅的解决方法或一种正确的方式来做到这一点?
It's as if ActiveRecord is silently treating my has_one as a has_many. Can someone explain this behavior to me? Is there an elegant workaround or a "right way" to do it?
推荐答案
也许你可以删除
has_many :scores, :through => :current_heat
和,而不是仅仅代表:分数通过HAS_ONE:
and instead just delegate :scores through the has_one:
delegate :scores, :to => :current_heat
这将preserve所需的访问方法Category.first.scores。
that would preserve your desired access method Category.first.scores.
这篇关于轨道3的has_many通过HAS_ONE的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!