私は条件付き連鎖を実装しようとしました、そしてこれは私が得たものです:
コントローラインデックスアクションコード:
@range_start = params[:range_start]
@range_stop = params[:range_stop]
Contract.within_range(@range_start, @range_stop)
モデルコード:
def self.within_range(range_start = Date.today - 1.month, range_stop = nil)
self.started_after(range_start).started_before(range_stop)
end
def self.started_after(range_start)
if range_start.blank?
self
else
self.where('start_date >=?', range_start)
end
end
def self.started_before(range_stop)
if range_stop.blank?
self
else
self.where('start_date<=?', range_stop)
end
end
動作しますが、見栄えがよくありません。を使って少し改善しようとしましたがtap
、成功しませんでした。このコードをどのように改善できますか?
更新:Inはインライン条件付きに変換できますが、何か他のものを改善できる可能性がありますか?
range_start.blank? ? self : self.where('start_date >=?', range_start)
UPDATE2:range_stop
が設定されていない場合、このコードは実際には機能せず、started_after
条件は適用されません。
started_before
最初の状態を緩めないために私は何から戻らなければなりませんか?