将表加载到数组常量中

时间:2016-10-04 14:32:25

标签: ruby-on-rails ruby

我有一个Rails应用程序,它本质上是一个发票和支付系统。在应用程序中我有2个表,包含misc_charges代码和描述(即:id:1,代码:'01'desc:'苹果',id:2,代码:'02',desc:'香蕉'等)另一个表是学分(即:id:1,代码:'30',desc:'Coupon',id:2,代码:'31',desc:'AAA rebate'等)。这些代码不会发生太大变化,我们可能会添加代码而不是修改或删除任何代码。

目前,我们将字母数字代码存储在主事务表中。例如'01','02','30'或'31'。我本来可以使用rails / postgresql生成的id,但是我们使用alpha代码的原因是因为这些数据最终需要导出并导入另一个系统,该系统使用这些字母数字代码作为misc费用和学分的主要标识符。

无论如何,当前在应用程序中,当用户(或管理员)审查其交易历史记录或特定发票时,使用交易表我会使用模型方法获得字母数字代码的具体描述。

TagViewGroup

然后在视图中我用这个:

class MiscCharge < ActiveRecord::Base
  def self.get_desc(r_code)
    result = MiscCharge.select("misc_charges_desc").where("code = ?", r_code)
   return result[0].misc_charges_desc
  end
end

目前,应用程序处于开发模式,我们正在暂存环境中进行一些测试。我们没有很多交易,但是我不得不认为调用模型来显示每个代码的描述必然会在事务计数突然增加或我们有多个用户使用App时产生一些性能问题在同一时间。

有没有办法将这些代码和描述(在大多数情况下基本上是静态的)作为常量加载到数组中?我已经看过关于Ruby on Rails常量的文章,您可以在application.rb或初始化文件夹中定义,但我看到的示例主要是针对静态数据......不是从表中加载的东西......模型是否可用从application.rb或初始化程序中提取数据?

可以像这样简单吗

<td>
  <%if p.type == "R"%>
    <h5 align ="left"><%=MiscCharge.get_desc(p.code)%></h5>
  <% else %>   
    <h5 align ="left"><%=Credit.get_desc(p.code)%></h5>
  <% end %>
</td>

还是还有其他东西吗?

一旦我在数组中有这个,我如何在视图中替换Model方法调用以获取正确的描述?

2 个答案:

答案 0 :(得分:1)

你非常接近,但我建议将缓存保留在该类方法中:

class MiscCharge < ActiveRecord::Base
  def self.get_desc(r_code)
    # pre-fill the array
    @misc_charges_by_code ||= MiscCharge.select(:id, :code, :desc).map {|e| e.attributes.values}.inject({}) {|memo, charge| memo[charge.code] = charge; memo }
    return @misc_charges_by_code[r_code] if @misc_charges_by_code[r_code]
    result = MiscCharge.select("misc_charges_desc").where("code = ?", r_code)
    return @misc_charges_by_code[r_code] = result[0].misc_charges_desc
  end
end

如果您需要访问缓存的帐户,可以使用MiscCharge.instance_variable_get("@misc_charges_by_code")甚至清除MiscCharge.instance_variable_set("@misc_charges_by_code", {})

答案 1 :(得分:0)

托马斯的答案做了伎俩,但我不得不稍微调整一下,但最终还是让它起作用了。我收到错误“未定义方法`代码'[2,”税务研讨会费“,”07“]:数组”

我认为这是因为map函数的结果是一个数组,因此它没有代码属性。我能够弄明白,阅读注入功能。

最终结果如下所示

@misc_charges_by_code ||= MiscCharge.select(:id, :code, :misc_charges_desc).map {|e| e.attributes.values}.inject({})  {|memo, misc| memo[misc[2]] = misc[1]; memo}
return @misc_charges_by_code[r_code] if @misc_charges_by_code[r_code]
result = MiscCharge.select("misc_charges_desc").where("code = ?", r_code)
return @misc_charges_by_code[r_code] = result[0].misc_charges_desc