实现'if else'条件的有效方法



我有三个数据库布尔列googleyahoobing。我需要在html.erb页面上打印它们。

  • "google + yahoo + bing"如果这三个都是true
  • "google + yahoo"如果仅googleyahootrue
  • "google"如果仅googletrue

有没有有效的方法来实施此操作?如果我以传统方式进行,那么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(' + ')

不建议将其直接放入视图中,有两个选项

  1. 将此代码拉到相应的View_helper方法中,并在视图中调用该方法。

  2. 如果此代码不仅在视图中使用,还具有业务逻辑,您可以将此代码拉到模型中,然后您可以使用实例调用此方法。
    例如: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"

使用三元操作员,但有点复杂

最新更新