【问题标题】:ActiveRecorded associated model back referenceActiveRecorded 关联模型反向引用
【发布时间】:2010-11-26 09:03:05
【问题描述】:

使用 has_many/belongs_to 方法很容易将一个模型关联到另一个模型。让我们假设以下模型:

class Movie < ActiveRecord::Base
    has_many :actors
end

所以,我可以从给定的电影实例中找到演员。但是现在,给定一个通过 actors 关联获得的演员实例,我想在关联中找到相关的电影实例。一些方法,如 'associated_instance' 或 'back_association' 会使以下语句返回 true:

movie_instance.actors[0].**associated_instance** == movie_instance

有没有内置的方法可以做到这一点?

谢谢

【问题讨论】:

  • 我认为 Movie 和 Actor 之间的关系应该是多对多而不是多对一?

标签: ruby-on-rails activerecord associations


【解决方案1】:

假设您正确定义了您的关系,我猜您遇到的情况是您想要有效地遍历关联,然后向后遍历。

movie.actors.movie

使用 HABTM 关系,rails 不会在演员集合上为您构建 .movi​​e 方法,但您可以做的是扩展关联以包含这样的方法:

class Movie < ActiveRecord::Base
  has_and_belongs_to_many :actors do
    def movie
      proxy_owner
    end
  end
end

在 Rails 指南网站上有 Mike Gunderloy 撰写的关于关联扩展的优秀指南:http://guides.rubyonrails.org/association_basics.html#association-extensions

希望我在这个问题上的回答是正确的 :)

【讨论】:

    【解决方案2】:

    是的,你可以做你想做的事

    movie_instance.actors[0].movie 
    

    问题仍然存在,因为您已经拥有它,为什么要这样做

    【讨论】:

    • 一旦正确建模,这可能无法正常工作。假设这个模型与现实相符,演员会“拥有很多”电影。
    • 我想这是一个不幸的例子。显然,电影 演员是 HABTM。这只是一个例子。将其更改为“电影”has_many“情节”。我的实际应用程序与电影 x 演员无关。
    【解决方案3】:

    ...给定一个actor实例 通过演员协会...

    如果您使用演员关联,则您已经拥有movie 对象。您想在这里解决什么问题?

    我的怀疑是,如果我们最终了解您想要完成的工作,答案将是“阅读 'has_and_belongs_to_many' 和/或 'has_many :through' 上的文档。”

    编辑:

    我刚刚注意到您在下面的说明(尽管电影和情节也可以被视为多对多,因为它们会无限循环)。

    假设您确实在尝试使用多对一关系,那么您忘记以下问题的根源是什么?

    class Plot < ActiveRecord::Base
      belongs_to :movie
    end
    

    【讨论】:

    • 当你得到演员时,你会拥有电影对象,这是真的。但是让我们假设您选择其中一个演员并将其传递给某个算法或函数,这些算法或函数既复杂又复杂,并且在某些时候,您需要相关的电影。显然,我不需要在演员被检索到的地方的电影,只是在将来的某个时间。
    • 演员有“has_many”电影吗?似乎是的,但你还没有清除它。如果是这样,您最好的选择可能是传递连接对象而不是参与者。然后你可以参考@acting_job.movi​​e 和@acting_job.actor。
    猜你喜欢
    • 1970-01-01
    • 2014-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-12
    • 1970-01-01
    • 2012-10-30
    相关资源
    最近更新 更多