Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 通过所属对象关联两个模型_Ruby On Rails_Ruby_Activerecord_Associations_Belongs To - Fatal编程技术网

Ruby on rails 通过所属对象关联两个模型

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

我有两种ActiveRecord型号,
A
B
<代码>A有很多:B和
B属于:A
。当然,
B
有一个
a\u id

我有一堆
a
,每次我创建一个新的
B
,如果某些条件成立,我想将它与
a
关联

目前,我正在检索可能的
A
,并将其链接到A
B
,如下所示:

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模型中的关联信息,并为您创建相关记录。所以,只要你使用这个助手,你就不用担心把东西粘在一起了。