Ruby on rails 通过所属对象关联两个模型
我有两种ActiveRecord型号,Ruby on rails 通过所属对象关联两个模型,ruby-on-rails,ruby,activerecord,associations,belongs-to,Ruby On Rails,Ruby,Activerecord,Associations,Belongs To,我有两种ActiveRecord型号,A和BA有很多:B和B属于:A。当然,B有一个a\u id列 我有一堆a,每次我创建一个新的B,如果某些条件成立,我想将它与a关联 目前,我正在检索可能的A,并将其链接到AB,如下所示: class B < ActiveRecord::Base attr_accessible :a_id belongs_to :a def link_to_a possible_as = A.where(some: condi
A
和B
<代码>A有很多:B和B属于:A
。当然,B
有一个a\u id
列
我有一堆a
,每次我创建一个新的B
,如果某些条件成立,我想将它与a
关联
目前,我正在检索可能的A
,并将其链接到AB
,如下所示:
class B < ActiveRecord::Base
attr_accessible :a_id
belongs_to :a
def link_to_a
possible_as = A.where(some: conditions)
self.a = possible_as.find_by_other-foreign-key_id(self.other_id) if possible_as != nil
# Then I have to perform an operation on the b's a such as:
self.a.linked_to_b_at = Time.now if self.a != nil
end
end
B类
这看起来很臭。有没有更好的方法将这两个模型联系起来?我想把
中有很多和属于的关系明确化会对我有所帮助。我一定是遗漏了什么。添加一个创建关联的后过滤器
class B < ActiveRecord::Base
attr_accessible :a_id
belongs_to :a
after_create :link_to_a
def link_to_a
update_attribute(:a_id, find_a )
end
def find_a #returns id of a
your logic to find a
...
end
end
B类
然后像平常一样创建模型B。
看看这个,它有管理这种类型的关联的完整示例
如果B与a有“属于”关系,则您创建B记录的方式不正确。您必须使用build
方法来创建相关记录。
例如:
def create_b_records
a = A.find(some_id)
a.build_b(new_record_attributes)
a.save
end
现在,这样一来,检索特定a记录集的所有B记录就变得非常简单:
possible_as = A.where(some_condition)
possible_as.each do |possible_a|
possible_a.b #Do whatever you want to do with these B records
end
谢谢你的回答。帖子和评论示例之间的区别在于,您总是知道帖子。这样,您就可以通过帖子访问评论。在我的例子中,类比是我总是知道A
,而只是通过A
访问B
。然而,在我的例子中,我只知道B
,我想从大量a
中链接B
和a
。看到区别了吗?您将运行一个对/a/:a_id/B的POST请求,数据将是您正在创建的B模型。然后在控制器中,您将拥有创建关联的逻辑。我不知道A。如果在创建B之前我不知道A的id,我如何发布到/A/:A_id/B?例如,我有500个带有时间属性的A。我向/B/create发送了一个POST请求,我希望B属于a谁的时间属性最接近时间。现在,当控制器接收到创建新B的POST请求时。嗯,这就是我已经在做的事情。使用后创建过滤器是一个很好的补充。我仍然有混乱的逻辑需要找到适当的A来关联B。所以我的问题集中在消除这种混乱。在与您讨论并阅读了另一个答案之后,我似乎无法避免寻找合适的A的混乱逻辑。您可以为A创建一个类方法来查找给定的A B模型。然后,在创建a和B模型的逻辑中,在保存它之前,只需将其设置为param。我会选择过滤器。还将查找逻辑封装在返回ASo的某个方法中,我会将create_b_records
方法放在BController中吗?然后,当我的BController的创建操作被调用时,我用我需要的任何参数调用我的create\u be\u records方法?我认为这可能会起作用,而且似乎更符合通过A访问B的想法。如果您将创建B记录的逻辑放在A的创建操作中,它将为您节省额外的查找操作。(如果你的方法在B的控制器中,你首先必须找到一个A记录并从中创建一个B记录。而在A的创建操作中,你已经有了A记录,你可以调用build方法来创建一个B记录。)也就是说,无论你在哪里创建B记录,都不重要,重要的是如何创建。buildhelper方法利用Rails模型中的关联信息,并为您创建相关记录。所以,只要你使用这个助手,你就不用担心把东西粘在一起了。