Ruby on rails Ruby用保护替换if块
我有一个服务对象,它根据指定的数据创建CSV文件。调用方法非常简单:Ruby on rails Ruby用保护替换if块,ruby-on-rails,ruby,Ruby On Rails,Ruby,我有一个服务对象,它根据指定的数据创建CSV文件。调用方法非常简单: def initialize(data) @data = data end def call CSV.generate(headers: true, col_sep: ';') do |csv| csv << csv_headers data.uniq.each do |contract| next if contract.transient
def initialize(data)
@data = data
end
def call
CSV.generate(headers: true, col_sep: ';') do |csv|
csv << csv_headers
data.uniq.each do |contract|
next if contract.transient
payment_details = [
next_payment_date(contract),
I18n.t("contracts.interval_options.#{contract.recurring_transaction_interval&.name}"),
]
csv << payment_details
end
end
end
private
def next_payment_date(contract)
if contract.upcoming_installment.nil?
I18n.t('tables.headers.no_next_payment_date')
else
contract.upcoming_installment.transaction_date.to_s
end
end
在我看来,这种方法看起来还不错。提高可读性是增加LOC或引入方法的有利权衡。也就是说,如果你真的喜欢,有很多方法可以让它成为一行
contract.upcoming_installment&.transaction_date || I18n.t('tables.headers.no_next_payment_date')
Ruby的安全导航
&.
将返回nil,如果即将发行的部分
为nil,则应返回到I18n
您所称的“guard”实际上是一个三元条件,Rubucop是对的,因为代码对三元条件的渴望太多了。这里需要&.transaction\u date
实际上是因为违反了Demeter法。这实际上应该通过在契约上定义一个方法来重构。
contract.upcoming_installment&.transaction_date || I18n.t('tables.headers.no_next_payment_date')