Ruby on rails 使用访问远程模型有许多直通和单独的联接表
如何从actor访问universe(反之亦然) 我有三种型号Ruby on rails 使用访问远程模型有许多直通和单独的联接表,ruby-on-rails,model-view-controller,controller,Ruby On Rails,Model View Controller,Controller,如何从actor访问universe(反之亦然) 我有三种型号 universe 字符 actor 宇宙和字符通过单独的联接表使用has_many TOR进行关联。 角色和演员通过一个单独的连接表使用has_many TO进行关联 (注意:我之所以决定不选择has_,而选择has_-many,而是选择has_-many to是因为公认答案中列出的原因) 我不希望在三个主表中的任何一个表中存储外键 universe \ \ universe_character_tie
universe
字符
actor
宇宙和字符通过单独的联接表使用has_many TOR进行关联。
角色和演员通过一个单独的连接表使用has_many TO进行关联
(注意:我之所以决定不选择has_,而选择has_-many
,而是选择has_-many to
是因为公认答案中列出的原因)
我不希望在三个主表中的任何一个表中存储外键
universe
\
\
universe_character_tie
/
/
character
\
\
character_actor_tie
/
/
actor
我想把宇宙和演员联系起来。。。通过角色。
我想到了两种方法:
(一)
如果我做了一个有很多到字符的关联类型,那将
绕过另外两个有许多通过连接的表;及
要求外键为`字符,对吗
(二)
什么都不要做。调用actor.character.universe
将已起作用。。。(这是真的吗)
我不确定我的臀部是否正确,我有点困在编码它。
有人能解释一下吗?请原谅,如果这是我的回答,因为我没有测试以下内容。我相信,只要你愿意声明,你就可以嵌套这些关联
class Actor < ActiveRecord::Base
has_many :character_actor_ties
has_many :characters, through: :character_actor_ties
has_many :universe_character_ties, through: :characters
has_many :universes, through: :universe_character_ties
end
class-Actor
然后只需调用actor.universes
,即可获得与某个actor角色关联的所有universe
编辑(解释)
上面的代码严重依赖rails的命名约定。在rails api中,通过
选项
指定要通过其执行查询的关联。这个可以
是任何其他类型的关联,包括其他:通过
协会。选项:类名称、:主键和:外键
忽略,因为关联使用源反射
这意味着调用actor.characters
将通过character\u actor\u ties
查找名为character
的关联,并使用在该关联上声明的规则来构建关联actor
和character
的sql查询
只需遵循此模式,直到找到一个与宇宙直接关联的模型,即宇宙字符
这应该可以:
class Universe < ActiveRecord::Base
has_many :universe_character_ties
has_many :characters, through: :universe_character_ties
has_many :actors, through: :characters
end
class UniverseCharacterTie < ActiveRecord::Base
belongs_to :universe
belongs_to :character
end
class Character < ActiveRecord::Base
has_many :universe_character_ties
has_many :universes, through: :universe_character_ties
has_many :character_actor_ties
has_many :actors, through: :character_actor_ties
end
class CharacterActorTie < ActiveRecord::Base
belongs_to :actor
belongs_to :character
end
class Actor < ActiveRecord::Base
has_many :character_actor_ties
has_many :characters, through: :character_actor_ties
has_many :universes, through: :characters
end
class-Universe
然后您可以调用actor.universes
或universe.actors
希望这有帮助actor.character.universe
不会起作用,因为rails不知道您想要哪个角色或哪个universe是正确的。我的措辞太松散了。假设我指定了哪个参与者和哪个宇宙,那么在当前设置的两个has\u many-through关系(如果可能的话)中调用代码会是什么样子?我确实想知道这是否可行,因为我在我的一个项目上有一个类似的设置,但只有一个has\u many-through关系。如果它能工作,那就太棒了。你能解释一下在有很多:宇宙字符,通过::字符有很多:宇宙,通过::宇宙字符
的背景下发生了什么吗最后两行(在结束之前
)在任何地方都需要额外的外键吗?不,它们在任何地方都不需要额外的外键。将通过更改为通过:)表示您是对的。很抱歉@jvnill在我发布我的答案之前,我没有看到你的答案…太棒了,所以从我已有的内容来看,我只需要向宇宙添加has_many:actors,through::characters
,以及has_many:Universe,through::characters
=即使字符不包含任何外键,rails如何使通过::characters
工作?使用到是否仅适用于帮助器方法?它知道访问另外两个联接表吗?