【问题标题】:How can i understand Ruby "super" in the context of super(options.merge(include: :comments))?我如何在 super(options.merge(include: :comments)) 的上下文中理解 Ruby “super”?
【发布时间】:2016-03-12 01:51:43
【问题描述】:

在 RoR 上堆叠 AngularJS 时,我看到了在模型文件中使用类似以下内容的示例,

  def as_json(options = {})
    super(options.merge(include: :comments))
  end

我的理解是,这允许 JSON 帖子散列在其中包含评论散列。如果我错了,请纠正我。

虚构示例

posts : [
    {id: 0, name: 'friday night', comments: {
        {id: 0, body: "that was a great night"},
        {id: 1, body: "i agree"}
        }   
    }
]

其他 SO 帖子中 super 的定义

super 关键字调用与当前同名的方法 当前类的超类中的方法。 ruby super keyword

...那么super 究竟在这里做什么?

【问题讨论】:

    标签: ruby-on-rails angularjs json


    【解决方案1】:

    首先,您的模型扩展了ActiveRecord::Base,对吗?例如,

    class Post < ActiveRecord::Base 
      # ... 
    end 
    

    ActiveRecord::Base 定义了一个as_json 方法。如果您没有在模型中定义def as_json,您仍然可以在实例上调用as_json,因为它继承其超类ActiveRecord::Base 的行为。


    其次,你知道ActiveRecord::Base#as_json 接受一些选项吗?例如,使用 only: 会将 JSON 限制为您指定的属性 (doc)。

    鉴于这些信息,您可以像这样致电as_json

    post.as_json(only: [:title, :published_at]) #=> {title: "...", published_at: "..."}
    

    include: 是您可以传递给as_json 的选项之一。


    第三,super 用于调用超类中的相同方法。所以,在这种情况下:

    class Post < ActiveRecord::Base 
      def as_json(options = {})
        super 
      end 
    end 
    

    super 将调用ActiveRecord::Base#as_json。这很好,因为该方法定义了这种行为!

    使用no 参数调用super 只会将原始 参数传递给该方法调用。所以,这些是等价的:

    def as_json(options = {})
      # `options` hash is passed _implicitly_:
      super 
    end 
    
    def as_json(options = {})
      # `options` hash is passed _explicitly_:
      super(options)
    end
    

    但是,如果你愿意,你可以在发送给 super 之前修改options。在您的示例中,情况就是这样:

    def as_json(options = {}) # 添加include: :comments 到任何提供的选项 new_options = options.merge(包括::cmets) # 将修改后的选项传递给super 超级(新选项) 结束

    这样,您可以确保您始终include: :comments 传递给ActiveRecord::Baseas_json 实现!


    希望有帮助!

    【讨论】:

      猜你喜欢
      • 2013-09-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-06
      • 1970-01-01
      • 1970-01-01
      • 2017-02-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多