【问题标题】:How do I get several attributes value and method value from an ActiveRecord model?如何从 ActiveRecord 模型中获取多个属性值和方法值?
【发布时间】:2015-06-04 23:00:16
【问题描述】:

为了解决我的问题,我在下面设置了虚拟汽车模型:

汽车模型具有
3 个属性(id、car_name、owner_name)和
2 个返回整数的方法(骑手、乘客)。

我想从所有汽车中获取 ONE HASH,它具有 2 属性和 2 方法的值。为了解决这个问题,我的临时解决方案如下:

json_format = Car.all.to_json(only: [:car_name, :owner_name], methods: [:riders, :passengers])
final_hash = ActiveSupport::JSON.decode(json_format)

这可行,但这很糟糕,因为我仅将 'to_json' 方法用于其可选功能。
他们还有其他选择可以通过自己的可选函数直接从 Car Model 获取一个哈希吗?

【问题讨论】:

    标签: ruby-on-rails ruby activerecord


    【解决方案1】:

    使用as_json。这是 to_json 在后台使用的,接受所有相同的选项,但返回 Hash

    【讨论】:

      【解决方案2】:

      我和你的感觉一样,对一个与 json 无关的方法使用 json 命令是不好的做法。

      如果你不介意冗长,你可以这样做:

      formatted_cars = Array.new
      Car.all.each do |c|
        formatted_cars.push( car_name: c.car_name,
                             owner_name: c.owner_name,
                             riders: c.riders,
                             passengers: c.passengers )
      end
      

      我发现当同时点击属性和方法时,只指定这样的分配是最干净的。这也是我将具有虚拟属性的对象传递给 javascript 时使用的技术。

      【讨论】:

        【解决方案3】:

        我同意将其转换为 Json 并返回是非常愚蠢的。我会这样做。

        Car.all.collect{|car| hash = {}; [:car_name, :owner_name, :riders, :passengers].each{|key| hash[key] = car.send(key)}; hash}
        

        将其放入对象的方法中会更简洁

        #in Car class
        def stats_hash
          hash = {}
          [:car_name, :owner_name, :riders, :passengers].each do |key|   
            hash[key] = self.send(key)
          end
          hash
        end
        

        然后做

        Car.all.collect(&:stats_hash)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多