【问题标题】:How can I refactor this Rails 3 code?如何重构此 Rails 3 代码?
【发布时间】:2010-12-26 14:19:22
【问题描述】:

有人能想出办法进一步重构吗?

@hourly_pay = {}
HourlyPay.all.each { |hp| @hourly_pay[t("hourly_pay.#{hp.amount}")] = hp.amount }

谢谢!


编辑:根据我收到的答案,这是我的重构方式

HourlyPay.all.map(&:amount).index_by { |hp| t("hourly_pay.#{hp.amount}") }

直接把它放到我的模型中,就变成了

  def self.get_options
   all.map(&:amount).index_by { |hp| I18n.t("hourly_pay.#{hp.amount}") }
  end

但是,我不确定这是否需要更多的计算,因为我在从数据库返回的值上调用 map,然后在上面调用 index_by。 由于我的 HourlyPay 模型仅包含 idamount,因此我不担心选择所有内容。但是,如果我有更多字段,我会改为执行以下操作:

def self.get_options
 select(:amount).map(&:amount).index_by { |hp| I18n.t("hourly_pay.#{hp.amount}") }
end

所以只选择了金额字段

感谢您的回复!

【问题讨论】:

  • 举一些t("hourly_pay.25")的例子?
  • 这是rails (edgeguides.rubyonrails.org/i18n.html) 提供的本地化方法。示例:t("hourly_pay.neg") 将返回“Negotiable”(假设我在本地化文件中定义了它)
  • 是的,我知道t,但我的意思是hourly_pay.23.99,例如,这意味着什么?!
  • 这意味着在本地化 YML 文件中,值 23.99neg 或其他值嵌套在另一个值 hourly_pay 下 - 这只是组织我的 YML 文件的一种方式.说我要本地化的蔬菜列表。我可以只调用t('cucumber')t('lettuce'),但我更愿意在我的YML 文件中将它们组织在vegetables 类别下,因此当我进行本地化时,我会调用t('vegetables.cucumber'),例如。但是,这与问题无关 - 我问的是重构 each 块以及是否必须在块之前声明 @hourly_pay ,例如:)

标签: ruby-on-rails refactoring ruby-on-rails-3


【解决方案1】:

这里的意图不是很清楚,但我建议你看看在可枚举类中使用 index_by 方法。您将获得完整的 HourlyPay 对象作为散列中的值,并且可以在一行中获取散列。

考虑将此代码放入模型中(如果还没有的话)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-08
    • 2017-07-26
    • 1970-01-01
    相关资源
    最近更新 更多