【问题标题】:What is the standard way to call a method on an array of instances?在实例数组上调用方法的标准方法是什么?
【发布时间】:2017-11-03 09:25:20
【问题描述】:

我正在尝试找出最好的方法是为 ruby​​ on rails 中的类实例数组编写方法。

我有以下解决方案:

class Asset < ActiveRecord::Base
  scope :owned_by, -> (user) { where(:user_id => user.id) }

  def self.get_tokens(user)
    all.owned_by(user).pluck(:tokens)
  end
end

我对解决方案并不完全满意,因为该方法是在类上调用的

Asset.get_tokens(user)

我宁愿在一组资产实例上调用它,而不必在控制器中进行映射。像这样的:

user_assets.get_tokens()

有标准的方法吗?

【问题讨论】:

    标签: ruby-on-rails arrays ruby


    【解决方案1】:

    首先,你不需要类方法,你可以直接调用作用域,

    class Asset < ActiveRecord::Base
    
      scope :owned_by, -> (user) { where(:user_id => user.id) }
    
    end
    

    要使用,只需说Asset.owned_by(user)

    要以逆格式(来自用户)获取记录,假设 User has_many Asset

    class User < ActiveRecord::Base
    
      def tokens
        assets.pluck(:tokens)
      end
    
    end
    

    可以称为User.find(1).tokens

    【讨论】:

      【解决方案2】:

      如果你想从一个数组中返回一个数组,而不是这样做......

      array = []
      some_collection.each do |item|
        array << item.value
      end
      

      你可以这样做:

      array = some_collection.map(&:value) # same as some_collection.map { |item| item.value } 
      

      相同
      array = some_collection.pluck(:value)
      

      【讨论】:

      • 谢谢,这与我最终寻求的解决方案相似。但是,假设数组处理比简单的 map 或 pluck 函数更复杂,你会在哪里编写这个函数?我个人不喜欢在控制器中编写这些函数,但我并没有真正了解如何在模型中实现它。
      • 最佳实践表明将其放入模型中比放入控制器中更好。原因是如果您需要在代码中的其他位置访问该函数(我们在 ruby​​ 中将它们称为方法),您不需要重写代码。如果您的用户有很多令牌(通过资产),将方法添加到 User 类就可以了:)
      • 采和图不一样! pluck 应该更有效地进行数据库通信。而map 在处理数组和散列时是通用的。仍然为列出选项 +1。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-30
      • 2012-11-02
      • 1970-01-01
      • 2016-08-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多