2011-09-01 52 views
1

在我的應用程序中,我有3個表格,用戶,列表,任務。Rails Migrations - 外鍵的替代名稱?

用戶和列表是多對多的關係,任務屬於列表,用戶可以完成任務。

對於我的遷移,當用戶完成列表時,我想將它在數據庫中完成的人存儲起來,但我不確定如何執行此操作。

我可以簡單地將t.integer :user_id添加到我的任務遷移中,但我想將其稱爲.completed_by。在我的用戶表中引用:user_id的東西,但名爲:completed_by?

回答

4

正如MrDanA提到的,你可以指定一個不同的foreign_key,但是我會推薦它。如果可以的話,如果你仍然使用實體名稱約定,那麼你的數據庫結構在低級別上會更容易理解。

未來,很明顯user_id指向用戶表,而新的程序員將無法在不探索代碼的情況下在用戶表處指出completed_by點。如果你確實想擁有一個特定的名字,或者需要多個用戶關聯,那麼類似於「completed_user_id」的東西在應用和數據庫級別都會保持清晰。

然後你可以添加方法:

has_one :user 

has_one :completed_by, :class_name => "User", :foreign_key => "completed_user_id" 

has_one :user 

def completed_by 
    self.user.id 
end 

1

在您的遷移,添加t.integer :completed_by

然後,在你的模型,而不是:

has_one :user 

做:

has_one :user, :class_name => "User", :foreign_key => "completed_by" 

甚至定製關聯的名稱,如:

has_one :completer, :class_name => "User", :foreign_key => "completed_by"