2009-02-06 21 views
3

我有兩個模型:Person和Relation。第二個存儲有關兩個人之間關係的信息。它有parent_id和child_id字段,並且沒有id字段。我把它與has_many連接起來,並且它可以工作。如何在Rails中不使用ID來管理表?

但是:

  1. Relation.find(:所有)返回即使有在表中的一些關係(becouse沒有id字段)空數組。
  2. 我不知道如何刪除關係。

我的模式是這樣的:

class Person < ActiveRecord::Base 
    has_many :child_relations, 
      :class_name => "Relation", 
      :foreign_key => "parent_id" 
    has_many :parent_relations, 
      :class_name => "Relation", 
      :foreign_key => "child_id" 

    has_many :children, :through => :child_relations 
    has_many :parents, :through => :parent_relations 
end 

class Relation < ActiveRecord::Base 
    belongs_to :parent, :class_name => "Person" 
    belongs_to :child, :class_name => "Person" 
end 

有什麼建議?

更新:我用has_many:通過 becouse我也存儲關於表中的關係類型的信息。目前我放棄了,我添加了ID字段到我的表(Rails約定...)。但我的問題仍然存在。

回答

7

has_many:through取決於連接表中的ID。它使連接表成爲一個完整的模型。由於每個有記錄的操作都發生在一個id上,所以如果沒有它,你將無法直接與一個表進行接口。當你刪除一條記錄的時候,通過它的id生成sql來刪除記錄。 如果您有一個充當全模型的連接表,它必須有一個編號

或者您可以使用has_and_belongs_to_many,它的工作原理與您預期的相似。通過關聯刪除對象的關係,而不是直接與關係模型關聯。

最好的辦法是給連接表添加一個ID。如果關係模型變得更加複雜,那麼將來可以將它作爲自己的實體進行追蹤。

0

這應該會朝着正確的方向邁出一步。我不在提示符下進行測試,但建立模型並嘗試使用它應該很快。希望能幫助到你!

class Relation < ActiveRecord::Base 
    belongs_to :parent, :class_name => "Person", :foreign_key => :parent_id 
    belongs_to :child, :class_name => "Person", :foreign_key => :child_id 
end 

class Person < ActiveRecord::Base 
    has_many :relations 
    has_many :children, :through => :relations 
    has_many :parents, :through => :relations 
end 
+0

它不工作,兩個has_and_belongs_to_many引用。您應該在人員模型中設置外鍵,而不是在關係中。在關係模型中,Rails會猜測外鍵的名稱,因爲它會將_id添加到關聯名稱(父級和子級)。所以模型的規格應該保留,就像我在我的問題中提出的一樣但無論如何,謝謝! – klew 2009-02-07 15:12:07

相關問題