【问题标题】:Rails format object in helper帮助程序中的 Rails 格式对象
【发布时间】:2014-02-26 22:43:18
【问题描述】:

当我在 ItemHelper 类中运行 Item.where(:id => id) 的简单查询并返回时

[
{
JDPA: null,
_id: "530e45f43f72fb3dee000001",
category: null,
created_at: "2014-02-26T19:52:20Z",
creator: "5170547c791e4b1a16000001",
detail: "Detail",
event_id: "52d958e73f72fb1e1f000001",
image_content_type: null,
image_file_name: null,
image_file_size: null,
image_updated_at: null,
question: null,
section: null,
title: "Title",
updated_at: "2014-02-26T19:52:21Z",
veh1: 5,
veh10: null,
veh2: 5,
veh3: 6,
veh4: null,
veh5: null,
veh6: null,
veh7: null,
veh8: null,
veh9: null,
version: null
}
]

我想得到一个:veh1..:veh10 的数组作为[5, 5, 6, null, ...]。这样做有很多麻烦...

我曾想过在我的助手中使用 JBuilder,但现在我把事情搞砸了......

我怎样才能做一些像使用.only(:veh1..:veh10 这样简单的事情并删除空值......然后我可能会创建一个数组。

想一想,cmets,我是不是很笨?这应该很容易吗?我是这里的初学者。 :)

我的答案

这感觉真的很草率。有一个更好的方法吗??更优雅??

def item_ppu(id)
  item = Item.where(:_id => id)
  newitem = item.map{|i| [i.veh1, i.veh2, i.veh3, i.veh4, i.veh5, i.veh6, i.veh7, i.veh8, i.veh9, i.veh10]}

  h = Hash.new(0)
  newitem[0].each { | v | h.store(v, h[v]+1) }

  f = 2*h[2]#lots more math

  return f
end

【问题讨论】:

  • 这是返回内容的 JSON 表示吗? Ruby 中没有null。实际对象是什么?
  • @Zach,是的,这就是 json 输出。我不确定如何检查对象...我的调试方法是更改​​帮助程序并刷新浏览器...这很糟糕吗?
  • 不,不一定,但在测试和使用控制台后,这将是我的第三选择。这是 Mongoid 模型吗?

标签: ruby-on-rails mapping mongoid helpers jbuilder


【解决方案1】:

如果这是一个 Mongoid 模型,并且您只是在寻找单个对象,您可以使用 find 然后映射到您需要的属性:

object = Item.find(id)

您可以使用values_at 从对象的属性散列中检索特定值(在 Mongoid 中,散列的键是字符串):

keys = (1..10).map {|n| "veh#{n}" } #=> ["veh1", "veh2" ...
values = object.attributes.values_at(*keys)
values.compact # removes the nil values from the array

综合起来:

object.attributes.values_at(*(1..10).map {|n| "veh#{n}" }).compact

编辑

为了编写干净、易于理解的代码,以下是我在生产应用程序中实际编写此代码的方式:

class Item
  # whatever goes here

  def ppu
    veh_values.inject {|result, value| # ... some calculation }
  end

  private

  def veh_values
    attributes.values_at(*veh_keys).compact
  end

  def veh_keys
    (1..10).map {|n| "veh#{n}" }
  end
end

现在这是Item 类上的一个实例方法,所以要调用它,你的语法是:

item.ppu

【讨论】:

  • 哇...这就是为什么我总是来这里。为了我个人的轨道改进,你能谈谈我想出的方法(几个小时后)吗?我的方法可以接受,还是做得不好?
  • @KevinBrown,您正在处理数组中的单个项目,因此使用对象而不是将其视为数组更有意义(map[0] 等)。我不太确定哈希或f 变量发生了什么。但这里是我用作判断一个方法是否“可接受”的标准: 1(最重要的):它容易理解吗? 2:它是否按照它所说的那样做,没有任何意想不到的副作用? 3:是否合理有效?我给你的代码对于单一方法来说有点过于复杂,所以我将编辑我的答案。待命。
  • 看起来不错,谢谢。如果我在循环中调用.ppu,但是(就像我认为的那样)那不起作用?在这种情况下,最好的方法是什么?
猜你喜欢
  • 2023-03-12
  • 1970-01-01
  • 2022-01-03
  • 2021-08-11
  • 2023-02-17
  • 2010-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多