Ruby on rails 创建对象/散列并将其存储在数组中
我正在尝试创建一个函数来验证存储在数据库中的数据。比如说我有一张桌子。对于Foo中的每一项,我调用一个函数saybar,该函数使用一组检查来验证它。如果数据不正确,我将项目id与失败原因的描述一起存储在散列中。散列被推送到数组上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
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)所说,我这样做是出于说教的原因。每当编写不可重用的代码时,我们可能会跳过诸如注释、测试、文档和适当的对象化等开销。我的答案适用于