Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.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 2 - Fatal编程技术网

Ruby on rails 创建对象/散列并将其存储在数组中

Ruby on rails 创建对象/散列并将其存储在数组中,ruby-on-rails,ruby,ruby-on-rails-2,Ruby On Rails,Ruby,Ruby On Rails 2,我正在尝试创建一个函数来验证存储在数据库中的数据。比如说我有一张桌子。对于Foo中的每一项,我调用一个函数saybar,该函数使用一组检查来验证它。如果数据不正确,我将项目id与失败原因的描述一起存储在散列中。散列被推送到数组上 ErrorList = [] MyHash = Hash.new {|h,k| h[k]=[]} Foo.each do |f| unless f.valid? MyHash["foo_id"] = f.id MyHash["de

我正在尝试创建一个函数来验证存储在数据库中的数据。比如说我有一张桌子。对于Foo中的每一项,我调用一个函数saybar,该函数使用一组检查来验证它。如果数据不正确,我将项目id与失败原因的描述一起存储在散列中。散列被推送到数组上

ErrorList = []
MyHash = Hash.new {|h,k| h[k]=[]}
Foo.each do |f|
    unless f.valid?
        MyHash["foo_id"] = f.id
        MyHash["description"] = "blah blah blah"
        ErrorList.push MyHash
    end
end
在执行结束时,数组中的所有项都相同,因为哈希项被覆盖。是否有一种方法可以使用此哈希在数组中存储不同的id和描述。否则,有没有办法使用对象来解决这个问题


我使用的是rails 2.3.5版

第一个MyHash不应该是驼峰式的,但您可以这样做

myhash = {}
Foo.each do |f|
    unless f.valid?
        myhash[f.id] = "blah blah blah"
    end
end

假设所有id都是唯一的,您只需要此哈希。这将把键值对设置为:
id
blah blah blah
第一个MyHash不应该是驼峰大小写,但您可以这样做

myhash = {}
Foo.each do |f|
    unless f.valid?
        myhash[f.id] = "blah blah blah"
    end
end

假设所有id都是唯一的,您只需要此哈希。这会将键值对设置为:
id
blah blah blah
我相信您可以使用和编写上述内容:

这将创建一个散列列表,每个散列都包含所有无效的
foo
“foo\u id”
“description”


要使代码正常工作,您需要确保为列表中的每个元素创建新的哈希,而不是重复使用已创建的哈希:

ErrorList = []
Foo.each do |f|
  unless f.valid?
    my_hash = Hash.new {|h,k| h[k]=[]}
    my_hash["foo_id"] = f.id
    my_hash["description"] = "blah blah blah"
    ErrorList.push my_hash
  end
end

我相信您可以使用和编写上述内容:

这将创建一个散列列表,每个散列都包含所有无效的
foo
“foo\u id”
“description”


要使代码正常工作,您需要确保为列表中的每个元素创建新的哈希,而不是重复使用已创建的哈希:

ErrorList = []
Foo.each do |f|
  unless f.valid?
    my_hash = Hash.new {|h,k| h[k]=[]}
    my_hash["foo_id"] = f.id
    my_hash["description"] = "blah blah blah"
    ErrorList.push my_hash
  end
end

正是Matz自己指出,随着时间的推移,“面向对象”成为一个如此常见的术语,以至于我们往往低估了它的威力。无论听起来多么过时,Ruby是一种OO语言,您应该用它编写OO程序。有许多可能的方法。一个可能的例子是

class ValidatedTable < Array
  def self.new array=[]
    array.each_with_object new do |e, o| o << e end unless array.empty?
    super
  end

  def << element
    fail TypeError, "blah blah blah" unless element.valid?
    super
  end
end

此解决方案的独特之处在于,它创建了一个特殊的数组子类,
ValidatedTable
,它在任何时候都保证只包含有效元素。试图将无效元素推入其中会产生错误,可以将其解救并用于生成错误列表。

正是Matz自己指出,随着时间的推移,“面向对象”成为一个非常常见的术语,我们往往低估了它的威力。无论听起来多么过时,Ruby是一种OO语言,您应该用它编写OO程序。有许多可能的方法。一个可能的例子是

class ValidatedTable < Array
  def self.new array=[]
    array.each_with_object new do |e, o| o << e end unless array.empty?
    super
  end

  def << element
    fail TypeError, "blah blah blah" unless element.valid?
    super
  end
end

此解决方案的独特之处在于,它创建了一个特殊的数组子类,
ValidatedTable
,它在任何时候都保证只包含有效元素。尝试将无效元素推入其中会引发错误,可以将其解救并用于生成错误列表。

使用的方法
Bar
在哪里?我应该编写语句f valid?作为Bar(f)@haanimasood,没关系,我们理解你的意思。使用的方法
Bar
在哪里?我应该写声明f有效吗?作为Bar(f)@haanimasood,没关系,我们理解你的意思。你的意思是
f.id
,而不是
“f.id”
+1的驼峰式备注。实际上,“我的散列”根本不需要是常量,它可以是变量
myhash
(如您所写)或
myu散列
(蛇形格)。如果有必要将其设为常量,则应在upcase snake中,
MY\u HASH
中。Camel-case(
MyHash
)是为模块和类保留的;第一个字母大写,这使它成为常数而不是变量。同样的反对意见也适用于
Myhash
。您的意思是
f.id
,而不是
“f.id”
+1作为驼峰案例备注。实际上,“我的散列”根本不需要是常量,它可以是变量
myhash
(如您所写)或
myu散列
(蛇形格)。如果有必要将其设为常量,则应在upcase snake中,
MY\u HASH
中。Camel-case(
MyHash
)是为模块和类保留的;第一个字母大写,这使它成为常数而不是变量。同样的反对意见也适用于编写
Myhash
。天哪,这是一个解决小问题的大锤。。。为什么它比天真的方法更好?在我看来,它比目前建议的解决方案更长、可读性差、可维护性差、性能差……很好,是最好的(也是最具教育性的)answer@UriAgassi,您绝对正确,用OO框架定义问题会带来开销。正如本杰明·辛克莱尔(Benjamin Sinclaire)所说,我这样做是出于说教的原因。每当编写不可重用的代码时,我们可能会跳过诸如注释、测试、文档和适当的对象化等开销。我的答案只适用于可重用代码。还有一种现象,我不知道它叫什么名字,最初的一次性脚本最终变成了可重用的宝石。天哪,这是解决一个小问题的一把大锤子。。。为什么它比天真的方法更好?在我看来,它比目前建议的解决方案更长、可读性差、可维护性差、性能差……很好,是最好的(也是最具教育性的)answer@UriAgassi,您绝对正确,用OO框架定义问题会带来开销。正如本杰明·辛克莱尔(Benjamin Sinclaire)所说,我这样做是出于说教的原因。每当编写不可重用的代码时,我们可能会跳过诸如注释、测试、文档和适当的对象化等开销。我的答案适用于