如何从ActiveRecord模型中获取多个属性值和方法值?

时间:2015-06-04 14:39:12

标签: ruby-on-rails ruby activerecord

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

  

汽车模型有    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获取一个哈希?

3 个答案:

答案 0 :(得分:3)

使用as_json。这是to_json在引擎盖下使用的内容,并接受所有相同的选项但返回Hash

答案 1 :(得分:0)

我觉得使用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的技术。

答案 2 :(得分:0)

我同意把它变成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)