2

在belongs_to關係中有沒有辦法使用through選項? Rails documentation on belongs_to沒有提及through作爲選項,爲什麼不呢?我想要做的東西像下面這樣:在belongs_to ActiveRecord協會上使用選項

class Lesson < ActiveRecord::Base 
    attr_accessible :name, :lesson_group_id 
    belongs_to :lesson_group 
    belongs_to :level, through: :lesson_group 
end 

class LessonGroup < ActiveRecord::Base 
    attr_accessible :name, :level_id 
    belongs_to :level 
    has_many :lessons 
end 

class Level < ActiveRecord::Base 
    attr_accessible :number 
    has_many :lesson_groups 
end 

然後,我可以做這樣的事情Lesson.first.level。使用最新的穩定Rai​​ls(截至目前的3.2.9)。

+0

@MrYoshiji - 在'has_one',Rails的文檔中說,「如果其他類包含的外鍵,才應使用這種方法。如果當前類包含外鍵,那麼你應該使用belongs_to來代替。「 –

+0

'has_one'的文檔還會顯示「選項:[...] - :通過 指定一個連接模型,通過該連接模型執行查詢,因爲:關聯使用:class_name,:primary_key和:foreign_key的選項將被忽略源反射,只能通過連接模型上的has_one或belongs_to關聯使用a:through查詢。「 – MrYoshiji

回答

3

the link你給:

指定與另一個類一到一對一的關聯。如果此類包含外鍵,則只應使用

我認爲你應該使用has_one :level, through: :lesson_group,像以下:

class Lesson < ActiveRecord::Base 
    attr_accessible :name, :lesson_group_id 
    belongs_to :lesson_group 
    has_one :level, through: :lesson_group 
end 

class LessonGroup < ActiveRecord::Base 
    attr_accessible :name, :level_id 
    belongs_to :level 
    has_many :lessons 
end 

class Level < ActiveRecord::Base 
    attr_accessible :number 
    has_many :lesson_groups 
end 

有關選項的文件爲has_one的一部分:

:通過

指定一個通過其執行查詢的加入模型。由於關聯使用源反射,因此選項for class_name,:primary_key和:foreign_key被忽略,因爲該關聯使用源反射。您只能使用 :通過查詢通過has_one或belongs_to關聯 加入模型。

他們談論了這裏: Rails has_one :through association

+0

這似乎沒有道理。 'Lesson'是'belongs_to:lesson_group',因爲它有外鍵。類似地,'LessonGroup'的'belongs_to:level'存在,因爲它具有外鍵。我會嘗試這個,但是不願意依賴這個機制,即使它是有效的,因爲在這種情況下文檔沒有明確地使用'has_one'。 –

+0

我同意,這種情況並不清楚。這可能會讓你感興趣:http://stackoverflow.com/questions/2116017/rails-has-one-through-association – MrYoshiji

+0

'belongs_to:through C' does not exist because the current table does not contain the foreign key that point到'C'。 –