Ruby中的attributes()方法
根据post的说法,要使属性在调用Ruby中的attributes()方法,ruby,Ruby,根据post的说法,要使属性在调用to_json期间保持不变,我们需要执行以下操作: def attributes super.merge('foo' => self.foo) end 以我的Ruby初学者知识,我无法理解以下内容: 是否每个Ruby类都有属性方法 super.merge在这里做什么?它将其参数附加到哪个hashmap 属性是类中属性、变量等的同义词。并非所有类都包含属性,但数据模型通常用于封装它们所包含的属性和方法,以及一些修改和/或操作它们的行为。为了响应模型的
to_json
期间保持不变,我们需要执行以下操作:
def attributes
super.merge('foo' => self.foo)
end
以我的Ruby初学者知识,我无法理解以下内容:
- 是否每个Ruby类都有
属性
方法
在这里做什么?它将其参数附加到哪个hashmapsuper.merge
respond_to :json
def tags
render :json => User.find(params[:id]).tags
end
属性是类中属性、变量等的同义词。并非所有类都包含属性,但数据模型通常用于封装它们所包含的属性和方法,以及一些修改和/或操作它们的行为。为了响应模型的json表示,您通常会在控制器中执行类似的操作
respond_to :json
def tags
render :json => User.find(params[:id]).tags
end
不,每个Ruby类都没有#attributes
方法。您正在使用的类可能继承自另一个类,或者混合在一个模块中,而该模块确实继承了(例如)
您正在定义的attributes方法将覆盖任何现有的#attributes
方法。在重写的情况下,Ruby提供了一个#super
方法,该方法调用要重写的原始方法。在本例中,您将调用原始的#attributes
方法,该方法返回属性键及其值的哈希值(例如{attr1:'a',attr2:'b'}
)
#merge
是一个散列函数,您正在调用原始#attributes
调用返回的散列(例如{attr1:'a',attr2:'b'}
)#merge
创建一个新的散列,该散列由原始属性散列和第二个散列中提供的键值对组成
从Ruby 2.2文档的Hash#merge
:
合并(其他_散列)→ 新建\u哈希单击以切换源
合并(其他散列){key,oldval,newval | block}→ 新杂凑
返回一个新的散列,其中包含其他_散列的内容和
hsh的内容。如果未指定块,则具有
重复的密钥将是其他_散列的密钥。否则,值为
每个重复键都是通过使用键调用块来确定的,
它在hsh中的值和在其他_散列中的值
h1 = { "a" => 100, "b" => 200 }
h2 = { "b" => 254, "c" => 300 }
h1.merge(h2) #=> {"a"=>100, "b"=>254, "c"=>300}
h1.merge(h2){|key, oldval, newval| newval - oldval}
#=> {"a"=>100, "b"=>54, "c"=>300}
h1 #=> {"a"=>100, "b"=>200}
关于您的示例的一些注释:'foo'=>self.foo
- 您不需要在
self.foo
中指定self
<代码>foo
就足够了。这实际上只适用于赋值self.foo='whatever'
以及在同一范围内定义了另一个foo
的情况
#attributes
返回的密钥类型匹配#attributes
返回字符串的散列->值,因此使用字符串键合并到散列中(ActiveRecord执行此操作)
案例2:#attributes
返回符号->值的散列,因此使用符号键合并散列:
{ :attr1 => 1, :attr2 => 'b' }.merge( { :attr3 => '3' }
不,每个Ruby类都没有#attributes
方法。您正在使用的类可能继承自另一个类,或者混合在一个模块中,而该模块确实继承了(例如)
您正在定义的attributes方法将覆盖任何现有的#attributes
方法。在重写的情况下,Ruby提供了一个#super
方法,该方法调用要重写的原始方法。在本例中,您将调用原始的#attributes
方法,该方法返回属性键及其值的哈希值(例如{attr1:'a',attr2:'b'}
)
#merge
是一个散列函数,您正在调用原始#attributes
调用返回的散列(例如{attr1:'a',attr2:'b'}
)#merge
创建一个新的散列,该散列由原始属性散列和第二个散列中提供的键值对组成
从Ruby 2.2文档的Hash#merge
:
合并(其他_散列)→ 新建\u哈希单击以切换源
合并(其他散列){key,oldval,newval | block}→ 新杂凑
返回一个新的散列,其中包含其他_散列的内容和
hsh的内容。如果未指定块,则具有
重复的密钥将是其他_散列的密钥。否则,值为
每个重复键都是通过使用键调用块来确定的,
它在hsh中的值和在其他_散列中的值
h1 = { "a" => 100, "b" => 200 }
h2 = { "b" => 254, "c" => 300 }
h1.merge(h2) #=> {"a"=>100, "b"=>254, "c"=>300}
h1.merge(h2){|key, oldval, newval| newval - oldval}
#=> {"a"=>100, "b"=>54, "c"=>300}
h1 #=> {"a"=>100, "b"=>200}
关于您的示例的一些注释:'foo'=>self.foo
- 您不需要在
self.foo
中指定self
<代码>foo
就足够了。这实际上只适用于赋值self.foo='whatever'
以及在同一范围内定义了另一个foo
的情况
#attributes
返回的密钥类型匹配#attributes
返回字符串的散列->值,因此使用字符串键合并到散列中(ActiveRecord执行此操作)
案例2:#attributes
返回符号->值的散列,因此使用符号键合并散列:
{ :attr1 => 1, :attr2 => 'b' }.merge( { :attr3 => '3' }
Hi
attributes
是由提供的方法。如果单击source
,您将注意到它实际上只是公开了实例变量@attributes
,它是一个散列
(可以是nil
,它通过强制为散列
我们将调用这个方法parent
,因为我们将在类中扩展它的行为。这可以通过以下方式实现:
Hi<代码
class Person < ActiveRecord::Base
def attributes
attrs = super # eg. { name: "x", created_at: [...], [...] }
attrs[:foo] = self.foo # eg. { name: "x", foo: [...], ... }
attrs
end
end