2013-02-13 26 views
0

我有兩個關聯的模型相同的模式:的Rails獲得相關車型

class Mail < ActiveRecord::Base 
    belongs_to :user, :class_name => 'UserFrom', :foreign_key => 'user_from' 
    belongs_to :user, :class_name => 'UserTo', :foreign_key => 'user_to' 
end 

當我運行索引操作下面的代碼不會得到正確的關聯模型,有什麼建議?

@mails = Mail.where('user_to = ?', current_user.id) 

使用時每行debug數據只能說明這一點:

--- 
- !ruby/object:Mail 
    attributes: 
    id: 1 
    created_at: 2013-02-13 21:17:41.962000000 Z 
    updated_at: 2013-02-13 21:17:41.962000000 Z 
    user_to: 1 
    user_from: 2 
    subject: Testing 
    body: Mail body blah blah blahhh 
    read: 
    read_at: 

回答

1

:class_name選項告訴Rails以及...類名。這裏(我假設)你沒有一個名爲UserFrom或UserTo的類。在app/models中有一個名爲User的類。

class Mail < ActiveRecord::Base 
    belongs_to :user_from, :class_name => 'User', :foreign_key => 'user_from' 
    belongs_to :user_to, :class_name => 'User', :foreign_key => 'user_to' 
end 

我要承擔外鍵的設置是否正確,以及他們兩人的包含用戶ID,即使他們沒有一個_id後綴。

至於@mails,您的查詢應該工作。但是,如果您在用戶上聲明has_many :mails關聯會更容易。這將允許您執行類似current_user.mails的操作。

1

你不能命名相同的關係。你要重命名的關係,這是一個例子:

class Mail < ActiveRecord::Base 
    belongs_to :sender, :class_name => 'User', :foreign_key => 'user_from' 
    belongs_to :receiver, :class_name => 'User', :foreign_key => 'user_to' 
end 

我也建議您重新命名外鍵,如「SENDER_ID」和「receiver_id」更多的可讀性。

用法:

@mails = Mail.where(sender: current_user) 
+0

剛進入數據庫,並改變了外鍵和附加_id他們每個人。在控制器中,我使用了你提供的where子句,但它帶有一個錯誤:'SQL錯誤或缺少數據庫(沒有這樣的列:mails.sender)'.... 我想冒險猜測並說出這個是由於我沒有正確地創建關係,是否有任何額外的行動我需要做以克里特關係? – Callum 2013-02-13 22:33:06

+1

您必須更改您的郵件遷移才能使用't.references:sender',以便在此情況下它將創建一個'sender_id'列。確保也在Mail模型上更新你的':foreign_key'選項以反映這個改變。 – 2013-02-13 23:07:55

+0

我已經設法遷移兩個引用並使用'@mails = Mail.where(receiver_id:current_user)'來獲取郵件,但是我仍然無法獲取每個郵件的關聯用戶。我錯過了什麼? – Callum 2013-02-13 23:49:56