2013-07-19 66 views
0

我想兩個表格相互鏈接的Rails belongs_to的返回nil類

class Musers < ActiveRecord::Base 
    # Email 
    # sid (student_id:integer) 
    # isyk: boolean 

    belongs_to :user, :foreign_key => "smail" 
end 

class Users < ActiveRecord::Base 

    belongs_to :muser, :foreign_key => "email" 

end 

但是,

@user = Users.first 
@user.muser returns nil 
+0

提供的答案解釋了核心問題,但是您生成'@ user'的方式也存在問題。你不應該複製模型名稱。相反,使用'@user = User.first'。 –

+0

@JamesChevalier user = Users.first創建的用戶不是User.first,它表示未初始化的常量 – Yagiz

+0

@Yagiz您應該將'Users'重命名爲'User',將'Musers'重命名爲'Muser'。應該以單數形式命名Rails模型。 –

回答

1

通過說:foreign_key => "smail"你告訴軌的Musersmail指向User模型的外鍵。這很可能不是這種情況。

假設User模型的主鍵被稱爲id,你應該爲user_id場Muser,並改變belongs_to :user, :foreign_key => "smail"到:

belongs_to :user 

User模型,你可以用定義反向關係:

has_one :muser 

此外,按照軌道模型的命名約定,您應該重命名UsersUserMusersMuser

您應該詳細瞭解belongs_tohas_one

另一方面,如果User模型實際上使用電子郵件作爲主鍵,我強烈建議您改變它並添加一個自動遞增的主鍵。作爲一個經驗法則,應該選擇主鍵,使其永不改變。如果它改變了,所有指向該主鍵的外鍵也必須改變。 如果您有特定的原因,您只應使用非自動遞增的主鍵。

上選擇一個主鍵的更多信息:How to choose my primary key?

1

那麼你不能只是告訴Rails協會的類型,你確實有設置關聯到該類的一個實例。例如,製作新的muser不會自動將用戶指定爲belongs_to。你可以這樣做

u = User.new 
u.muser = Muser.first 
u.save 

不過,我不知道你是想完成一個belongs_to的東西 - belongs_to的關係,但你應該知道,你所要做的不僅僅是告訴它存在的軌道。