2012-01-30 12 views
0

我正沿着Rails for Zombies教程試圖獲得RoR的主旨以及它如何運行。到目前爲止,這對Rails網站上的官方入門指南非常讚賞。爲什麼這個活動記錄where子句獲取正確的結果,如果我傳遞一個對象而不是該對象的屬性?

下面是數據的截圖我的工作:

enter image description here

我運行這個條款,它的工作原理,但我不明白爲什麼它的工作:

z = Zombie.find(1) 
w = Weapon.where(:zombie_id => z) 

所以在我看來,我讀到這樣的:

找到我的武器,其中Zombie_Id(數字!)是等於z(殭屍對象 - 非數字)

那麼這是怎麼工作?我在這裏錯過了什麼? RoR是否使用這個where子句在幕後做了一些魔術?

回答

3

在用於構建where(以及各種其他)濾波器,如果該類型被比較ActiveRecord的查詢檢查ActiveRecord::PredicateBuilder類構建函數是一個ActiveRecord ::模型,如果是它的ID進行比較:

def self.build(attribute, value) 
    case value 
    ... 
    when ActiveRecord::Model 
     attribute.eq(value.id) 
    ... 
    else 
     attribute.eq(value) 
    end 
end 

所以,是的,Rails的魔力,我想。

0

在ActiveRecord中內置了一堆有趣的東西,在這種情況下Active Record知道你在尋找:zombie_id,它也知道zombie_id是通過殭屍模型。所以它在那裏做出了假設。如果你沒有派遣一個殭屍班,它會拋出我相信的錯誤。

Active Record有很多涉及到的反射,並且很多助手或宏都會爲您免費提供這種類型的功能。這就是爲什麼我們ActiveRecord的忠實用戶非常喜歡ActiveRecord!

相關問題