Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.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 在调用create之前将主记录添加到表中_Ruby On Rails_Ruby_Ruby On Rails 4_Rails Activerecord - Fatal编程技术网

Ruby on rails 在调用create之前将主记录添加到表中

Ruby on rails 在调用create之前将主记录添加到表中,ruby-on-rails,ruby,ruby-on-rails-4,rails-activerecord,Ruby On Rails,Ruby,Ruby On Rails 4,Rails Activerecord,我有一个项目和一个列表模型。列表模型(因此,每个列表都可以包含作为子级的其他列表) 问题: 默认情况下,我想将每个新创建的列表(没有指定parent\u id)包含到一些“主列表”中,但我不知道如何确保主列表始终存在 可能的解决方案: 我想我需要先覆盖project.lists.create来创建一个主列表(如果它不存在),然后才允许创建新的列表。 我不知道如何正确而优雅地完成所有这些。任何帮助都将不胜感激,谢谢 我尝试了以下方法,但失败了,因为create被反复调用,这是一个无限递归: #

我有一个
项目
和一个
列表
模型。列表模型(因此,每个列表都可以包含作为子级的其他列表)

问题:
默认情况下,我想将每个新创建的列表(没有指定
parent\u id
)包含到一些“主列表”中,但我不知道如何确保主列表始终存在

可能的解决方案:
我想我需要先覆盖
project.lists.create
来创建一个主列表(如果它不存在),然后才允许创建新的列表。

我不知道如何正确而优雅地完成所有这些。任何帮助都将不胜感激,谢谢


我尝试了以下方法,但失败了,因为
create
被反复调用,这是一个无限递归:

# List model
before_create :create_master_list

private

def create_master_list
  self.project.lists.where(id: 9999).first_or_create do |master_list|
    master_list.id = 9999
  end
end
在rails控制台中键入
Project.find(1).lists.create
时输出错误:

SELECT  `lists`.* FROM `lists` WHERE `lists`.`id` = 1000 AND `lists`.`id` = 1000 AND `lists`.`id` = 1000 AND `lists`.`id` = 1000 AND `lists`.`id` = 1000 AND ...
ActiveRecord可能就是你要找的。如果不存在记录,它将创建并返回新记录

project.lists.where(parent_id: nil).first_or_create

您应该在项目的after_create钩子上创建主列表,确保它始终在那里

在项目模型中,沿着这条线做一些事情

#Project Model
after_create :create_master_list

  private
    def :create_master_list
      List.new(project_id: self.id, master: true)
    end

#List model
before_create :add_to_master_list, if: "parent_id.nil?"

private
def :add_to_master_list
  self.parent_id = get_project_master_list.id
end

def get_project_master_list
  return self.project.lists.where(master: true).first_or_create
end

您可以将“主列表”定义为
。其中(parent\u id:nil)
,不是吗?:)@D端我需要它是一个实际的列表,所以我可以通过调用
get_sub_tree(root)
(其中
get_sub_tree
是一个检索传入节点的所有子节点的自定义方法)来检索整个树,您可以修改此方法,将
root
设置为
nil
,这样来获取没有父集的列表。然而,我并不坚持,这是你的设计选择。@D-side我知道,但这不是一个优雅的解决方案,代码会变得混乱,imho。谢谢你的建议,虽然我照你的建议做了,但还是出错了。请查看更新的问题,并感谢您的回答,如果最初创建了一个孤儿列表(其家长id=nil),然后创建了主列表,初始列表将保持孤立。在创建列表之前,您仍然需要添加以将列表添加到主列表中。我主要关注的是确保主列表始终存在。是否存在在项目之前创建列表的场景?因此,如果主流程是这样的:项目只有一个主列表,而创建的任何列表都没有主列表父id应该转到这个主列表代码可能像我更新的答案你的方法是一个部分解决方案,因为如果主列表被意外删除,默认情况下不会重新创建,因此可能会引入一些讨厌的错误
#Project Model
after_create :create_master_list

  private
    def :create_master_list
      List.new(project_id: self.id, master: true)
    end

#List model
before_create :add_to_master_list, if: "parent_id.nil?"

private
def :add_to_master_list
  self.parent_id = get_project_master_list.id
end

def get_project_master_list
  return self.project.lists.where(master: true).first_or_create
end