2014-03-25 65 views
0

嗨在Rails belongs_to關聯的快速問題。如何在某些情況下創建belongs_to連接,Rails 4

在一個例子中,我們必須模擬Foo &哈。

class Foo < ActiveRecord::Base 
    end 


    class Hah < ActiveRecord::Base 
     belongs_to :foo 
    end 

標準的東西。但是我的問題就出現了。我如何創建代碼,以便Hah模型的每個記錄都有一個foo_id 但是而不是每個Foo模型的記錄都以這種方式與Hah模型相關聯。

I.e.

## Table foos ## 

    id  post 

    1  stuff 

    2  dancing 

    3  now 


## Table hahs ## 

    id  line  a_id 

    1  fill  2 

    3  this  3 

感謝所有幫助

回答

0

的問題是有點含糊由於FooHuh的命名,但這裏是最好的,我可以回答這個...

Active Record Documentation

2.1描述) A belongs_to關聯建立與另一個模型的一對一連接,使得聲明模型的每個實例「屬於」另一個模型的一個實例。例如,如果您的應用程序包括客戶和訂單,每個訂單可以被分配給一個客戶,你聲明的順序模式是這樣的:

class Order < ActiveRecord::Base 
    belongs_to :customer 
end 

2.2)一個has_one協會也建立了與另一個模型的一對一連接,但具有不同的語義(和後果)。該關聯指示模型的每個實例都包含或擁有另一個模型的一個實例。例如,如果您的應用程序每個供應商只有一個賬戶,你會宣佈這樣的供應商模式:選擇之間belongs_tohas_one 如果你想設置

class Supplier < ActiveRecord::Base 
    has_one :account 
end 

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

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

class Supplier < ActiveRecord::Base 
    has_one :account 
end 

class Account < ActiveRecord::Base 
    belongs_to :supplier 
end 

大約有零或一個關係 我認爲你正在尋找的「零或一」關係是HAS_ONE關係。這種關係不是強制性的(除非你添加一個驗證)。 還要檢查this question ...通常Account類看起來像下面,如果需要每個帳戶有一個有效的供應商

class Account < ActiveRecord::Base 
    belongs_to :supplier 
    validates_presence_of :supplier 
end 
+0

感謝您的幫助,我是在假設has_one是明確的,事實上,它必須有一個。 :)如果你好奇的情況是設計用戶有或沒有一個子存儲模型取決於他們的角色(rolify) – user3357855

+0

很高興我可以幫助...所有的關係並不需要FK在那裏,而是你有做驗證,以強制關係在那裏...我更新了答案,並添加了一個示例來驗證該帳戶是否需要擁有有效的供應商.. –

0

我認爲你在尋找這樣的事情:

遷移:

def change do 
    create_table :foos do |t| 
    t.string :post 
    t.timestamps 
    end 

    create_table :hahs do |t| 
    t.references :foo, null: false 
    t.string :line 
    t.timestamps 
    end 
end 

型號:

class Foo < ActiveRecord::Base 
    has_many :hahs 
end 

class Hah < ActiveRecord::Base 
    belongs_to :foo 
    validates :foo, presence: true 
end 

空:fals hahs表中的e位將確保如果不在數據庫級別上屬於Foo就不能創建Hah,並且驗證行確保ActiveRecord不會允許創建不屬於Ruby上的Foo的Hah水平。

+0

謝謝答案。有關存在驗證的信息將非常有用。 – user3357855

相關問題