簡體   English   中英

如何在紅寶石中干燥每個編碼?

[英]How to dry code with each in ruby?

這是我所擁有的:

_visits = _visits.select { |v| v.webmaster == options[:webmaster] } if options[:webmaster]
_visits = _visits.select { |v| v.country_code == options[:country_code] } if options[:country_code]
_visits = _visits.select { |v| v.created_at > options[:period].first && v.created_at < options[:period].last } if options[:period]

_leads = _leads.select { |l| l.webmaster == options[:webmaster] } if options[:webmaster]
_leads = _leads.select { |l| l.country_code == options[:country_code] } if options[:country_code]
_leads = _leads.select { |l| l.created_at > options[:period].first && l.created_at < options[:period].last } if options[:period]

如您所見,代碼實際上是相同的。 所以我嘗試了:

[ _visits, _leads ].each do |e|
  e = e.select { |_e| _e.webmaster == options[:webmaster] } if options[:webmaster]
  e = e.select { |_e| _e.country_code == options[:country_code] } if options[:country_code]
  e = e.select { |_e| _e.created_at > options[:period].first && _e.created_at < options[:period].last } if options[:period]
end

而且它沒有用,因此紅寶石按價值傳遞。 這里有任何解決方法嗎?

我認為這可能有效

_visits, _leads = [ _visits, _leads ].map do |e|
  e = e.select { |_e| _e.webmaster == options[:webmaster] } if options[:webmaster]
  e = e.select { |_e| _e.country_code == options[:country_code] } if options[:country_code]
  e.select { |_e| _e.created_at > options[:period].first && _e.created_at < options[:period].last } if options[:period]
end

完全沒有測試,但是現在作為當前答案的代碼已經有了(通過自己的過錯,他們只是在回答您提出的問題)以及您的原始代碼-將會遍歷您的潛在客戶和您的訪問了三次。 這可能會降低性能,但是請考慮執行以下操作:

_visits, _leads = [_vists, _leads].map do |e|
  e.select do |elem|
    (options[:webmaster] ? elem.webmaster == options[:webmaster] : true)
    && (options[:country_code] ? elem.country_code == options[:country_code] : true)
    && (options[:period] ? _e.created_at > options[:period].first && _e.created_at < options[:period].last : true)
  end
end

為了清理它並避免在您的選項中查找大量哈希(不知道它將進行多少次檢查或花費多少),您可以執行此操作。

webmaster    = options[:webmaster]
country_code = options[:country_code]
period       = options[:period]

_visits, _leads = [_vists, _leads].map do |e|
  e.select do |elem|
    (webmaster ? elem.webmaster == webmaster : true)
    && (country_code ? elem.country_code == country_code : true)
    && (period ? _e.created_at > period.first && _e.created_at < period.last : true)
  end
end

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM