2013-05-12 79 views
1

我有一個用戶模型用於保存所有用戶。在我的應用程序,導師和學生中,用戶有兩種類型,但它們具有相同的結構。Rails has_many關係的動態外鍵

我想做這樣的事情。

has_many :requests, :foreign_key => mentor? ? 'mentor_id' : 'student_id', :class_name => 'Request' 

我有導師?方法,但它給了我一個method_missing錯誤。我假設它是因爲它在dynamic_matchers.rb

這尋找的方法是錯誤它給

/var/lib/gems/1.9.1/gems/activerecord-3.2.13/lib/active_record/dynamic_matchers.rb:55:in 'method_missing': undefined method 'mentor?' for #<Class:0x00000001b40630> (NoMethodError)

有沒有辦法去了解這一點沒有做一個單獨的型號爲學生和導師?我覺得看到他們都使用相同的領域是沒有必要的。

+0

你爲什麼要不同的ID列?這個邏輯應該僅在用戶模型上,而不是在請求上。此外,你想要的是不可能的:D – jokklan 2013-05-12 20:58:04

回答

5

好了,所以讓我糾正:這是不可能的,即使在一個烏托邦世界它,或者你發現了這是一個解決方法,它肯定是不正確

你是什麼其實要找的是繼承(STI或單表的繼承Rails中)和多態性之間的混合。

如何以正確的方式執行此操作?

你有用戶模型,學生導師 AR都用戶所以他們都將繼承這種模式。

class User < ActiveRecord::Base 
end 

class Student < User 
end 

class Mentor < User 
end 

這意味着什麼?那麼這意味着用戶模型認爲(沒有你做其他任何事情)字段至極要麼包含「學生」或「導師」或什麼取決於你如何初始化對象:

user = User.create() 
student = Student.create() 
mentor = Mentor.create() 

現在,您的請求可以屬於學生導師。所以在這裏你可以設置一個多態關聯,像這樣:

class Student < User 
    has_many :requests, as: :owner 
end 

class Mentor < User 
    has_many :requests, as: :owner 
end 

class Request < ActiveRecord::Base 
    belongs_to :owner, polymorphic: true 
end 

現在你可以這樣寫:

student.requests 
mentor.requests 
request.owner 
+0

該請求屬於導師和學生。我會如何去做這件事? Rails如何知道它是學生還是導師? – Anujan 2013-05-12 21:22:48

+0

我只是使用單表繼承,非常感謝您的幫助! :) – Anujan 2013-05-12 21:36:27

+1

不客氣:) – Raindal 2013-05-12 21:41:57

1

我不太清楚你需要什麼。 同樣的模型結構,一個用戶可以成爲許多學生的導師?一個學生可以有一個導師?就是它?

如果是,自我加入怎麼辦?

class User < ActiveRecord::Base 
    has_many :students, :class_name => "User", :foreign_key => "mentor_id" 
    belongs_to :mentor, :class_name => "User" 
end 

這樣你就能夠調用student.mentor和mentor.students

+0

我在另一個模型中有學生與導師的關係,因爲導師可以有多個學生。 – Anujan 2013-05-12 21:27:09

+0

但我發佈的方式,你也可以有多個學生與一位導師相關=) – 2013-05-12 23:14:28

+0

對不起,麻煩!斯巴達已經回答了,我沒有看到它在標籤搜索。 – 2013-05-13 13:02:27