2012-12-25 113 views
1

我有一個模型Show和一個模型Artist。我想從ShowArtist的參考,但不反之亦然。activerecord has_one

因此,一個Show有一個Artist就是這樣。我這樣做:

class Artist < ActiveRecord::Base 
end 

class Show < ActiveRecord::Base 
    has_one :artist 
end 

但它不起作用。我每次做:

a_show.artist = an_artist 

它不分配它。此外,我得到這個:

棄用警告:你想創建一個屬性show_id'. Writing arbitrary attributes on a model is deprecated. Please just use attr_writer`等(從(IRB)irb_binding叫:3)

在我的數據庫,我有在shows類型的表Integer中稱爲artist_id的列。

+0

你有沒有試過把belongs_to的:展會上的藝術家模型,只是用於測試目的,以看看這個工作? –

回答

2

我有一個名爲artist_id在類型整數

的節目表在這種情況下列中,在類Show的關係應該是belongs_to代替has_one(該belongs_to總是在其上包含類外鍵)。

+0

謝謝,這工作!但是你不認爲它應該被稱爲「has_one」,因爲這更有意義,不是嗎?節目有(has_one)藝術家,而不是belongs_to。無論如何,這工作,再次感謝! – 0xSina

0

對於這種類型的混淆你應該指的Rails導向Choosing Between belongs_to and has_one截面。

如果要在兩個模型之間建立一對一的關係,則需要將belongs_to添加到一個模型中,並將has_one添加到另一個模型中。你怎麼知道哪個是哪個?

區別在於放置外鍵的位置(它放在聲明belongs_to關聯的類的表格上),但是您應該考慮數據的實際含義。 has_one關係表示,某件事是你的 - 也就是說,有些東西指向你。例如,說一個供應商擁有一個賬戶比一個賬戶擁有一個供應商更有意義。這表明,正確的關係是這樣的:

class Supplier < ActiveRecord::Base 
    has_one :account 
end 

class Account < ActiveRecord::Base 
    belongs_to :supplier 
end 

相應的遷移可能是這樣的:

class CreateSuppliers < ActiveRecord::Migration 
    def change 
    create_table :suppliers do |t| 
     t.string :name 
     t.timestamps 
    end 

    create_table :accounts do |t| 
     t.integer :supplier_id 
     t.string :account_number 
     t.timestamps 
    end 
    end 
end