我有三个数据库布尔列google
,yahoo
,bing
。我需要在html.erb页面上打印它们。
-
"google + yahoo + bing"
如果这三个都是true
。 -
"google + yahoo"
如果仅google
和yahoo
是true
。 -
"google"
如果仅google
是true
。
有没有有效的方法来实施此操作?如果我以传统方式进行,那么if .. else
条件将很大。
怎么样?
def result
%w[google yahoo bing].keep_if {|m| obj.public_send(m) }.join(' + ')
end
您可以将值推入数组并加入它们,例如此
search_engines = []
search_engines << 'google' if google
search_engines << 'yahoo' if yahoo
search_engines << 'bing' if bing
search_engines.join(' + ')
不建议将其直接放入视图中,有两个选项
将此代码拉到相应的View_helper方法中,并在视图中调用该方法。
如果此代码不仅在视图中使用,还具有业务逻辑,您可以将此代码拉到模型中,然后您可以使用实例调用此方法。
例如:obj.search_engines.join(' ')(假设该方法的名称是search_engines,并且您仅从该方法返回一个数组)
使用助手方法,
module ApplicationHelper
def get_platform(obj)
straray = []
strarray << 'google' if obj.google
strarray << ' + ' if obj.google && obj.yahoo
strarray << 'yahoo' if obj.yahoo
strarray << ' + ' if obj.yahoo && obj.bing) || (obj.google && obj.bing)
strarray << 'bing' if obj.bing
strarray.join
end
end
致电此= get_platform(obj)
假设您有一个my_object
对象,
%i(google yahoo bing).map do |engine|
engine if my_object[engine]
end.compact.join(' + ')
此解决方案易于扩展到任何数量的发动机。
一种可能的解决方案(假设您的对象是@m)
<%= "#{'google' if @m.google}" +
"#{' + ' if @m.google && @m.yahoo}" +
"#{'yahoo' if @m.yahoo}" +
"#{' + ' if (@m.yahoo && @m.bing) || (@m.google && @m.bing)}" +
"#{'bing' if @m.bing}"
%>
(google && yahoo)? ? "google + yahoo" : ((google && yahoo && bing))? ? "google + yahoo + bing" : (google)? ? "google" : "none"
使用三元操作员,但有点复杂