2009-06-05 79 views
1

我有一個人物模型和鏈路模型。鏈接模型表示從角色到另一角色的鏈接。鏈接具有文字「描述」屬性。從字符A到字符B的鏈接不同於從B到A的相反鏈接。字符與另一個字符有零或一個鏈接。一個角色可能有不同角色的各種鏈接。一個角色可以通過各種不同的角色來鏈接。連接表的ActiveRecord關係鏈接相同表的兩條記錄?

我二手Active Record的關係,以實現部分字符和鏈接模型之間的關係:

class Character 
has_many :links # the links from the character to other characters 

class Link 
belongs_to :character # the character from which starts the link to another character 

這給我有用的方法,如character.links或link.character(從這個字符開始的所有環節的陣列) (人物從開始的鏈接)

鏈接機型還具有to_character_id其中包含的字符誰去鏈接的ID。因此,從字符A到人物B的鏈路是具有以下屬性的實例:

  • character_id =字符的id一個
  • to_character_id =人物B
  • description的ID =一些文本

我寫各種額外的方法,比如character.links_to(返回一個指向字符的所有環節的陣列)或link.to_character(返回一個指向該鏈接的文字),或character.characters_who_link_to (返回其他字符的數組,其中包含該字符的鏈接)。我還寫了一個回調,以確保刪除一個字符時,所有去這個字符的鏈接都會被刪除(恢復相同)。

可以使用額外的AR關係的聲明這會爲我提供這種額外的方法,這樣我就不用自己寫這些方法和回調?

敏捷Web開發使用Rails呈現在節中的解決「使用模型作爲聯接表」,但對於一個連接表連接兩個不同的表。 在我的情況下我的連接錶鏈接加入一個表的記錄,人物。

+0

所以基本上你想要字符has_and_belongs_to_many:characters關係? – ErsatzRyan 2009-06-05 18:17:05

回答

3

has_and_belongs_to_many不再被使用;我會用has_many :through代替。

class Character < ActiveRecord::Base 
    has_many :links, :dependent => destroy 
    has_many :characters, :through => :links 

    has_many :source_links, :class_name => "Link", 
    :foreign_key => "to_character_id", :dependent => :destroy 
    has_many :source_characters, :class_name => "Character", 
    :through => :destination_links 
end 

class Link < ActiveRecord::Base 
    belongs_to :character 
    belongs_to :source_character, :class_name => "Character", 
    :foreign_key => "to_character_id" 
end 

:dependent => :destroy選項 - 這將刪除該鏈接時,該角色將被刪除。命名是對的 - 從角色的角度來看,source_links是鏈接那個字符。所以,現在你可以這樣做:

@character.characters # characters I link to 
@character.links # links I have to other characters 
@character.source_characters # characters that link to me 
@character.source_links # links other characters have to me 
2

我想你想要像下面這樣:

class Character < ActiveRecord::Base 
    has_many :outbound_links, :class_name => "Link", :foreign_key => "from_character_id" 
    has_many :inbound_links, :class_name => "Link", :foreign_key => "to_character_id" 
end 

class Link < ActiveRecord::Base 
    belongs_to :from_character, :class_name => "Character", :foreign_key => "from_character_id" 
    belongs_to :to_character, :class_name => "Character", :foreign_key => "to_character_id" 
end 

您可以在http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html

0

閱讀所有關於ActiveRecord關聯的選項,我認爲你真的要在這裏是一個自我指涉HABTM使用一個連接表

所以,如果你有一個連接表關係

create_table :character_links do |t| 
    t.integer :character_id 
    t.integer :linked_character_id 
    t.timestamps #if you want to know when the relationship was created 
end 

那麼你將有

class Characters < ActiveRecord::Base 
    has_and_belongs_to_many :linked_characters, 
     :class_name => "Characters", 
     :join_table => :character_links, 
     :foreign_key => "character_id", 
     :associated_foreign_key => "linked_character_id" 

,如果你需要的外向鏈接和導入鏈接,那麼你可以只是做

class Characters < ActiveRecord::Base 
    has_and_belongs_to_many :outgoing_links, 
     :class_name => "Characters", 
     :join_table => :character_links, 
     :foreign_key => "character_id", 
     :associated_foreign_key => "linked_character_id" 

    has_and_belongs_to_many :incoming_links, 
     :class_name => "Characters", 
     :join_table => :character_links, 
     :foreign_key => "linked_character_id", 
     :associated_foreign_key => "character_id" 

只需切換foreign_key和associated_foreign_key

這消除了你的需要有一個單獨的鏈接模型

這是空氣公司de(未測試)