Ruby on rails 链接同一表的两条记录的联接表的ActiveRecord关系?

Ruby on rails 链接同一表的两条记录的联接表的ActiveRecord关系?,ruby-on-rails,activerecord,Ruby On Rails,Activerecord,我有一个角色模型和一个链接模型。链接模型表示从一个角色到另一个角色的链接。链接具有文本“描述”属性。从字符A到字符B的链接不同于从B到A的相反链接。一个字符到另一个字符有零个或一个链接。一个字符可能有指向不同字符的各种链接。一个字符可以通过各种不同的字符链接到 我使用活动记录关系部分实现角色和链接模型之间的关系: class Character has_many :links # the links from the character to other characters class

我有一个角色模型和一个链接模型。链接模型表示从一个角色到另一个角色的链接。链接具有文本“描述”属性。从字符A到字符B的链接不同于从B到A的相反链接。一个字符到另一个字符有零个或一个链接。一个字符可能有指向不同字符的各种链接。一个字符可以通过各种不同的字符链接到

我使用活动记录关系部分实现角色和链接模型之间的关系:

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的链接是具有以下属性的实例:

  • 字符\u id
    =字符A的id
  • 到字符\u id
    =字符B的id
  • 说明
    =一些文本
我编写了各种额外的方法,如
character.links\u to
(返回指向该字符的所有链接数组)或
link.to\u character
(返回指向该链接的字符)或
character.characters\u谁链接到该字符(返回具有指向该字符链接的其他字符数组). 我还编写了一个回调,以确保在删除角色时,所有指向该角色的链接都会被删除(恢复时也是如此)

是否可以使用额外的AR关系声明来为我提供这种额外的方法,这样我就不必自己编写这些方法和回调

使用Rails的敏捷Web开发在“使用模型作为联接表”一节中提供了一个解决方案,但用于联接两个不同表的联接表。
在我的例子中,我的联接表链接单个表的联接记录,字符。

我想您需要如下内容:

 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
类字符“Link”,:foreign\u key=>“from\u character\u id”
有很多:入站链接,:类名称=>“链接”,:外键=>“到字符\u id”
结束
类链接“character”,:foreign\u key=>“from\u character\u id”
属于:属于字符,:类名称=>“字符”,:外键=>“属于字符id”
结束

您可以在

上阅读有关ActiveRecord关联的所有选项,我想您需要以下内容:

 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
类字符“Link”,:foreign\u key=>“from\u character\u id”
有很多:入站链接,:类名称=>“链接”,:外键=>“到字符\u id”
结束
类链接“character”,:foreign\u key=>“from\u character\u id”
属于:属于字符,:类名称=>“字符”,:外键=>“属于字符id”
结束

您可以在

上阅读有关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
如果你有一个连接表

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"
类字符“字符”,
:join\u table=>:字符\u链接,
:foreign\u key=>“字符\u id”,
:关联的\u外部\u键=>“链接的\u字符\u 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"
类字符“字符”,
:join\u table=>:字符\u链接,
:foreign\u key=>“字符\u id”,
:关联的\u外部\u键=>“链接的\u字符\u id”
_和_属于_很多:传入的_链接,
:class_name=>“字符”,
:join\u table=>:字符\u链接,
:外键=>“链接字符\u id”,
:关联的\u外键=>“字符\u id”
刚刚切换了外键和关联的外键

这样就不需要使用单独的链接模型


这是air代码(未测试)

我认为您真正想要的是使用联接表的自引用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
如果你有一个连接表

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"
类字符“字符”,
:join\u table=>:字符\u链接,
:foreign\u key=>“字符\u id”,
:关联的\u外部\u键=>“链接的\u字符\u 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"
类字符“字符”,
:join\u table=>:字符\u链接,
:foreign\u key=>“字符\u id”,
:关联的\u外部\u键=>“链接的\u字符\u id”
_和_属于_很多:传入的_链接,
:class_name=>“字符”,
:join\u table=>:字符\u链接,
:外键=>“链接字符\u id”,
:关联的\u外键=>“字符\u id”
刚刚切换了外键和关联的外键

这样就不需要使用单独的链接模型


这是air代码(未测试)

拥有且属于许多
已不再使用;我会使用
has\u 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

拥有并且属于许多
不再真正使用;我会使用
has\u 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

所以基本上你想让角色有一个has_和属于多个角色的关系?那么basica呢