【发布时间】: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 模型仅包含 id 和 amount,因此我不担心选择所有内容。但是,如果我有更多字段,我会改为执行以下操作:
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.99或neg或其他值嵌套在另一个值hourly_pay下 - 这只是组织我的 YML 文件的一种方式.说我要本地化的蔬菜列表。我可以只调用t('cucumber')和t('lettuce'),但我更愿意在我的YML 文件中将它们组织在vegetables类别下,因此当我进行本地化时,我会调用t('vegetables.cucumber'),例如。但是,这与问题无关 - 我问的是重构each块以及是否必须在块之前声明@hourly_pay,例如:)
标签: ruby-on-rails refactoring ruby-on-rails-3