Ruby on rails 使用访问远程模型有许多直通和单独的联接表

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

如何从actor访问universe(反之亦然)

我有三种型号
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
    工作?使用
    是否仅适用于帮助器方法?它知道访问另外两个联接表吗?