[英]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.