Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/65.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/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 根据rabl中的条件排除一些子项_Ruby On Rails_Ruby_Rabl - Fatal编程技术网

Ruby on rails 根据rabl中的条件排除一些子项

Ruby on rails 根据rabl中的条件排除一些子项,ruby-on-rails,ruby,rabl,Ruby On Rails,Ruby,Rabl,我也经历过其他类似的问题,不幸的是,似乎没有什么能帮助我的处境 我正试图使用rabl生成JSON,但如果子对象所需的任何属性为nil,我希望跳过该子对象。我的原始模板看起来像 child :links, :root => :edges, :object_root => :datas do node(:id) { |link| link.id.to_s() } node(:source) { |link| link.parent_id.to_s() } node

我也经历过其他类似的问题,不幸的是,似乎没有什么能帮助我的处境

我正试图使用rabl生成JSON,但如果子对象所需的任何属性为nil,我希望跳过该子对象。我的原始模板看起来像

child :links, :root => :edges, :object_root => :datas do
    node(:id) { |link| link.id.to_s() }
    node(:source) { |link| link.parent_id.to_s() }
    node(:target) { |link| link.child_id.to_s() }
end
我一直在想如何排除这些东西。所以如果我有

child :links, unless: lambda{|l| l.child_id == nil || l.parent_id == nil},:root => :edges, :object_root => :datas do
    node(:id) { |link| link.id.to_s() }
    node(:source) { |link| link.parent_id.to_s() }
    node(:target) { |link| link.child_id.to_s() }
end
我得到一个错误“未定义的工作儿童id…”。所以很明显,即使它在子声明中,它仍然是指父声明。我尝试将代码移动到一个单独的文件中并包含它,但收到了相同的错误。使用if语句也有同样的问题

然后我试着

child :links, :root => :edges, :object_root => :datas do
    node(:id, unless: lambda{|l| l.child_id == nil || l.parent_id == nil} ) { |link| link.id.to_s() }
    node(:source, unless: lambda{|l| l.child_id == nil || l.parent_id == nil}) { |link| link.parent_id.to_s() }
    node(:target, unless: lambda{|l| l.child_id == nil || l.parent_id == nil}) { |link| link.child_id.to_s() }
end
但这给了我{“数据”:{},这是我不想要的。如果它不符合条件,我什么都不要

根据中的一些回复,我尝试了

并收到“ActiveRecord::Associations::CollectionProxy::ActiveRecord\u Associations\u CollectionProxy\u链接的未定义方法'child\u id'”

这件事这么难做,我觉得很奇怪。基本上,如何在循环的每个步骤中引用单个子元素?这样我就可以检查它并忽略它。这是rabl rails的问题吗

编辑:

因此,在阅读之后,我尝试了以下方法:

#works.rb
def valid_links
    links = self.links.select {|l| l.parent_id != nil && l.child_id != nil}
    return links
end

#works/show.json.rabl
child :valid_links => "edges" do
    node(:id) { |link| link.id.to_s() }
    node(:source) { |link| link.child_id.to_s() }
    node(:target) { |link| link.parent_id.to_s() }
end
这几乎奏效了。但是,我需要定义对象的根和根。我只是通过设置有效的链接指向我需要的对象来绕过root,但是每当我试图定义对象的根时,就会得到[:valid\u links,“links”]:Array的“未定义的方法`id”。这有什么办法吗

谢谢。

假设您可以像这样将子对象传递到块:

child :links, :root => :edges, :object_root => :datas do |child|
  unless child.child_id.nil?
    ...
  end
end

(在文档中搜索“您也可以传入当前对象”)。

我刚刚尝试了一下,不幸的是,它返回了“未定义的‘child_id’方法,一种间接的解决办法是在孩子们到达rabl之前将他们排除在外。也就是说,在你的模型上,你可以定义一个过滤子对象的方法,并调用它而不是链接。是的,这就是我所做的(我编辑了我的问题)。不幸的是,出于某种原因,这阻止了我使用object_root(和root)。因此,现在我正试图找出另一种设置对象根的方法。
child :links, :root => :edges, :object_root => :datas do |child|
  unless child.child_id.nil?
    ...
  end
end