Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/53.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 在第一次循环一个集合之后,如何将属性数组写入一个列?_Ruby On Rails_Ruby_Ruby On Rails 4 - Fatal编程技术网

Ruby on rails 在第一次循环一个集合之后,如何将属性数组写入一个列?

Ruby on rails 在第一次循环一个集合之后,如何将属性数组写入一个列?,ruby-on-rails,ruby,ruby-on-rails-4,Ruby On Rails,Ruby,Ruby On Rails 4,所以基本上我想做的是,在我的n.parents属性上,我想设置一个类似[val1,val2,val3,val4]的值 我的setter方法如下所示: def parents=(*parents) write_attribute(self.base_class.ancestry_column, if parents.nil? nil

所以基本上我想做的是,在我的
n.parents
属性上,我想设置一个类似
[val1,val2,val3,val4]
的值

我的setter方法如下所示:

def parents=(*parents)
  write_attribute(self.base_class.ancestry_column, 
                          if parents.nil? 
                            nil 
                          else 
                            parents.map(&:child_ancestry)
                          end
                 )
end
但当我运行此命令时,会出现以下错误:

> n.parents= a,b
NoMethodError: undefined method `child_ancestry' for #<Array:0x007f9fb0072fb8>
你需要写:

parents.flatten.map(&:child\u祖先)

因为
*parents
splat参数包含一个数组数组,如果您检查它,它看起来像这样:

看一看

它接受上述内容并将其转换为以下内容:

[#,#]

然后,您可以像以前一样使用
map

您需要写:

parents.flatten.map(&:child\u祖先)

因为
*parents
splat参数包含一个数组数组,如果您检查它,它看起来像这样:

看一看

它接受上述内容并将其转换为以下内容:

[#,#]


然后,您可以像以前一样在其上使用
map

在赋值中使用splat运算符很奇怪,为什么不这样做呢

def parents=(new_parents)
  ancestry = if new_parents.nil? 
               nil 
             else 
               new_parents = [new_parents] unless new_parents.is_a?(Array)
               new_parents.map(&:child_ancestry).join('/')
             end
  write_attribute(self.base_class.ancestry_column, ancestry)
end
然后你仍然可以写作

n.parents = a,b
(在分配中自动转换为数组)

splat操作符将再次将给定参数包装到数组中。所以只要放下splat操作符。它用于函数调用,在赋值时它没有任何意义

手动尝试:

您需要在控制台中尝试一下,看看它是否有效:

> my_parents = a,b 
> ancestry = my_parents.map(&:child_ancestry) 
> n.ancestry_column = ancestry

在赋值中使用splat操作符很奇怪,为什么不做类似的事情呢

def parents=(new_parents)
  ancestry = if new_parents.nil? 
               nil 
             else 
               new_parents = [new_parents] unless new_parents.is_a?(Array)
               new_parents.map(&:child_ancestry).join('/')
             end
  write_attribute(self.base_class.ancestry_column, ancestry)
end
然后你仍然可以写作

n.parents = a,b
(在分配中自动转换为数组)

splat操作符将再次将给定参数包装到数组中。所以只要放下splat操作符。它用于函数调用,在赋值时它没有任何意义

手动尝试:

您需要在控制台中尝试一下,看看它是否有效:

> my_parents = a,b 
> ancestry = my_parents.map(&:child_ancestry) 
> n.ancestry_column = ancestry


所以你的逻辑是有道理的,但当我尝试它时,我仍然会得到同样的错误。我也不知道如何检查父母。这是:
>n.parents=a,b NoMethodError:from/.rvm/gems/ruby-2.1的未定义方法“child_祖先”。5@test_tree_app/bundler/gems/escentry-eb5a3e448112/lib/escentry/instance_methods.rb:173:in'map'
我还用我尝试过的更多东西编辑了这个问题。所以你的逻辑是有道理的,但当我尝试时,我仍然会得到同样的错误。我也不知道如何检查
*父母。这是:
>n.parents=a,b NoMethodError:from/.rvm/gems/ruby-2.1的未定义方法“child\u祖先”。5@test_tree_app/bundler/gems/escentry-eb5a3e448112/lib/escentry/instance_methods.rb:173:in'map'
我还用我尝试过的更多东西编辑了这个问题。我尝试了这个,但我仍然得到相同的错误,也就是:n.parents=a,b NoMethodError:from/.rvm/gems/ruby-2.1的未定义方法“child_祖先”。5@test_tree_app/bundler/gems/escentry-eb5a3e448112/lib/escentry/instance_methods.rb:173:in'map'
我还用我尝试过的更多东西编辑了这个问题。好吧,我不明白。
new\u parents
是一个数组,因此映射应该可以工作。如果对属性和赋值都使用
parents
,会造成混淆,这将导致问题。为了清晰起见,我展示了(并重构)该函数。与其使用
write\u属性
,我更喜欢只分配列。如果您需要更新straigt away的值,我更喜欢使用
更新属性祖先列:祖先。您在赋值中使用它,这没有意义。它通常用于(正常)方法,只是“吞咽”所有给定变量。例如,
printf
。我很少使用它,但它允许灵活的参数列表。例如,在我开发的一个gem中,我使用它的原因是:我并不真正喜欢它,因为我更喜欢在函数调用中使用一个更明确的“契约”。虽然我很想获得100分的赏金,但我认为@nathanvda在函数签名中使用显式契约是绝对正确的,完全值得赏金。marcamillion:关于契约式设计的概念——如果你还不知道这个概念,它在软件设计中非常强大。另外,我尝试了这个方法,但仍然得到了相同的错误,也就是:n.parents=a,b NoMethodError:for#from/.rvm/gems/ruby-2.1的未定义方法“child_祖先”。5@test_tree_app/bundler/gems/escentry-eb5a3e448112/lib/escentry/instance_methods.rb:173:in'map'
我还用我尝试过的更多东西编辑了这个问题。好吧,我不明白。
new\u parents
是一个数组,因此映射应该可以工作。如果对属性和赋值都使用
parents
,会造成混淆,这将导致问题。为了清晰起见,我展示了(并重构)该函数。与其使用
write\u属性
,我更喜欢只分配列。如果您需要更新straigt away的值,我更喜欢使用
更新属性祖先列:祖先。您在赋值中使用它,这没有意义。它通常用于(正常)方法,只是“吞咽”所有给定变量。例如,
printf
。我很少使用它,但它允许灵活的参数列表。例如,在我开发的一个gem中,我使用它的原因是:我并不真正喜欢它,因为我更喜欢在函数调用中使用一个更明确的“契约”。虽然我很想获得100分的赏金,但我认为@nathanvda在函数签名中使用显式契约是绝对正确的,完全值得赏金。marcamillion:关于契约式设计的概念——如果你还不知道这个概念,它在软件设计中非常强大。还有,你能给我们看一下类的定义吗,因为我现在