2009-09-08 65 views
1

使用has_many/belongs_to方法很容易将模型关联到另一个模型。假设以下型号:ActiveRecorded关联模型返回参考

class Movie < ActiveRecord::Base 
    has_many :actors 
end 

因此,我可以从给定的电影实例中找到演员。但是现在,考虑到通过演员关联获得的演员实例,我想找到关联中的电影实例。像“associated_instance”或“back_association”一些方法将作如下声明返回true:

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

是否有任何内置的方式做到这一点?

感谢

+0

在这个问题捅我假设电影和演员之间的关系应该是多对多而不是多对一? – Staelen 2009-09-08 05:42:04

回答

0

...给获得 通过演员协会的演员实例...

如果您使用的演员协会,您已经有movie对象。你在这里试图解决什么问题?

我的怀疑是,如果我们最终达到了你想要完成的目标,答案将是“阅读'has_and_belongs_to_many'和/或'has_many :through'上的文档。”

编辑:

我刚才注意到您的澄清如下(虽然电影和情节可以被认为是多到多为好,因为它们会无休止地循环使用)。

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

class Plot < ActiveRecord::Base 
    belongs_to :movie 
end 
+0

当你得到演员时,你会有电影对象,这是真的。但是让我们假设你从这些演员中选择一个演员并将其传递给一些算法或函数,这些演算法或函数非常复杂,并且在某些时候需要相关电影。 很显然,我不会需要电影在演员被检索的地方,只是将来的某一点。 – taksan 2009-09-09 12:36:27

+0

做演员“has_many”电影吗?看起来是的,但你还没有清除。如果是这样,你最好的选择可能是传递连接对象而不是演员。然后,您可以参考@ acting_job.movi​​e和@ acting_job.actor。 – jdl 2009-09-09 13:15:15

0

是的,你可以做你想要使用什么

movie_instance.actors[0].movie 

问题仍然是你为什么会想这样做,因为你已经拥有它

+0

这可能无法正常工作。假设这个模型符合现实,演员将会拥有“has_many”电影。 – jdl 2009-09-08 13:26:21

+0

这是一个不幸的例子,我想。显然,电影<->演员是一个HABTM。这只是一个例子。 更改为“电影”has_many“绘图”。我的实际应用与电影x演员无关。 – taksan 2009-09-09 12:39:23

1

假设你有你的关系,正确定义,我猜你遇到的情况是你想有效地遍历一个关联,但然后遍历回来,例如。

movie.actors.movie 

随着HABTM关系轨道不建.movi​​e这方法对你的演员集合,但你可以做的是延长协会包括这样的方法:

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

有是联想扩展一个优秀的导游麦克Gunderloy轨道上的指南网站:http://guides.rubyonrails.org/association_basics.html#association-extensions

希望我已经在正确的方向:)