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:关于契约式设计的概念——如果你还不知道这个概念,它在软件设计中非常强大。还有,你能给我们看一下类的定义吗,因为我现在