为了解决我的问题,我在下面设置了虚构的汽车模型:
汽车模型有 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获取一个哈希?
答案 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)