Ruby中的attributes()方法

Ruby中的attributes()方法,ruby,Ruby,根据post的说法,要使属性在调用to_json期间保持不变,我们需要执行以下操作: def attributes super.merge('foo' => self.foo) end 以我的Ruby初学者知识,我无法理解以下内容: 是否每个Ruby类都有属性方法 super.merge在这里做什么?它将其参数附加到哪个hashmap 属性是类中属性、变量等的同义词。并非所有类都包含属性,但数据模型通常用于封装它们所包含的属性和方法,以及一些修改和/或操作它们的行为。为了响应模型的

根据post的说法,要使属性在调用
to_json
期间保持不变,我们需要执行以下操作:

def attributes
  super.merge('foo' => self.foo)
end
以我的Ruby初学者知识,我无法理解以下内容:

  • 是否每个Ruby类都有
    属性
    方法
  • super.merge
    在这里做什么?它将其参数附加到哪个hashmap

属性是类中属性、变量等的同义词。并非所有类都包含属性,但数据模型通常用于封装它们所包含的属性和方法,以及一些修改和/或操作它们的行为。为了响应模型的json表示,您通常会在控制器中执行类似的操作

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
    返回的密钥类型匹配
  • 案例1:
    #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
    返回的密钥类型匹配
  • 案例1:
    #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