2013-11-26 154 views
0

我有這些代碼段(我剛學的回報率順便說一句,所以請把它容易對我來說,我做了一些谷歌搜索已;)):紅寶石(on Rails的)協會

class CreateMicroposts < ActiveRecord::Migration 
    def change 
    create_table :microposts do |t| 
     t.string :content 
     t.integer :user_id 

     t.timestamps 
    end 

    add_index :microposts, [:user_id, :created_at] 
    end 
end 

class Micropost < ActiveRecord::Base 
    belongs_to :user 
    validates :user_id, presence: true 
end 

這一個:

class User < ActiveRecord::Base 
    has_many :microposts 
    end 

沒有什麼困難的事情在這裏。我都明白了。有一件事我不明白,雖然是這句話(關於邁克爾·哈特爾的教程,我讀):

一旦我們定義適當的協會,@micropost 變量導致將自動已經user_id說明等於其關聯的用戶。

現在Rails如何做到這一點,爲什麼這會自動完成?任何解釋這一點的努力都將不勝感激。

+0

抱歉,但是這不是問這種問題的正確的地方。你可以在Ruby on Rails論壇上提問。 – jvnill

+0

本教程應該解釋這一點(或者更好的是,Rails的書實際上是深入解釋的)。 [Rails指南也很好地覆蓋了它](http://guides.rubyonrails.org/association_basics.html)。 –

回答

1

Rails是關於「約定優於配置」的想法,如果您按照一定數量的規則進行遊戲,那麼Rails可以爲您處理很多事情。當你說「用戶有許多Microposts並且Micropost屬於每個模型中的用戶時,Rails自動知道Microposts表中的user_id字段指向用戶模型中的id字段,並且User表中的micropost_id字段指向在微柱相關的ID字段然後你可以這樣做:

@ user.microposts把所有該用戶 @ micropost.user中微型柱,以獲得microspost的用戶

對於這個「。魔術「的工作,你需要在模型本身中聲明」擁有許多「和」屬於「參數,並正確命名鍵爲」user_id「和micropost_id,否則它將不起作用。

+0

所以你試圖說,在創建模型時,如果我創建'usr_ids'而不是'user_id',那麼它將無法工作。這意味着Rails會查找「user」和「id」這兩個詞嗎? – Emanuel

+0

是的,這就是它如何知道這兩個人是屬於對方的。命名也很重要。 User.microposts和Micropost.users是有區別的。複數是關係的「許多」,單數是「一個」。 – fatfrog

+0

非常感謝。我不知道Rails如何「自動」知道這一點。 – Emanuel