假設你有以下型號:軌道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