Ruby on rails 链接同一表的两条记录的联接表的ActiveRecord关系?
我有一个角色模型和一个链接模型。链接模型表示从一个角色到另一个角色的链接。链接具有文本“描述”属性。从字符A到字符B的链接不同于从B到A的相反链接。一个字符到另一个字符有零个或一个链接。一个字符可能有指向不同字符的各种链接。一个字符可以通过各种不同的字符链接到 我使用活动记录关系部分实现角色和链接模型之间的关系: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
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的链接是具有以下属性的实例:
=字符A的id字符\u id
=字符B的id到字符\u 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呢