有效的实施方式' if else'条件

时间:2017-08-29 05:24:55

标签: ruby-on-rails ruby

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

  • "google + yahoo + bing"如果这三个都是true
  • "google + yahoo"如果只有googleyahootrue
  • "google"如果google只有true

有没有有效的方法来实现这个?如果我以传统方式进行,那么if .. else条件就会很大。

6 个答案:

答案 0 :(得分:4)

这个怎么样?

def result
   %w[google yahoo bing].keep_if {|m| obj.public_send(m) }.join(' + ')
end

答案 1 :(得分:2)

您可以将值推入数组并加入它们,就像这样

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(&#39; +&#39;)(假设方法的名称是search_engines而你只从方法中返回一个数组)

答案 2 :(得分:1)

使用辅助方法,

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)

答案 3 :(得分:1)

假设您有my_object个对象,

%i(google yahoo bing).map do |engine|
  engine if my_object[engine]
end.compact.join(' + ')

此解决方案可轻松扩展到任意数量的引擎。

答案 4 :(得分:0)

一种可能的解决方案(假设您的对象是@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}"
%>

答案 5 :(得分:-3)

(google && yahoo)? ? "google + yahoo" : ((google && yahoo && bing))? ? "google + yahoo + bing" : (google)? ? "google" : "none"

使用三元运算符,但它有点复杂