了解ruby案例陈述

时间:2013-06-07 11:32:15

标签: ruby-on-rails ruby

这是我的代码第一个

  def participation_earning(partcpnt_usr)
    case show_participant_users
    when Array
      puts "***********Inside Array Statement - #{Time.now} *********"
      sleep 1
      show_participant_users.find do |show_prtcpnt_usr|
        show_prtcpnt_usr.show_participant_id == partcpnt_usr.participant_id
      end
    when ActiveRecord::Relation
      puts "***********Inside Relation Statement - #{Time.now} *********"
      sleep 1
      show_participant_users.where(:show_participant_id => partcpnt_usr.participant_id).first
    else
      puts "Will always go in else part"  
    end  
  end 

很少有解释show_participant_users是用户之间的关系对象 @user.show_participant_users

现在困扰我的是,即使show_participant_users的类是一个数组,它仍会进入其他区块,不知道为什么(只是为了确认show_participant_users不是nil它是一个数组)

相反,下面的代码按预期工作

array_fields = []

case array_fields
 when Array
  puts "Ruby Array"
 when Hash
  puts "Ruby Hash"
end

除了简洁之外我还不想使用if / else语句之外的任何其他想法

感谢你

3 个答案:

答案 0 :(得分:1)

使用:

case show_participant_users.class

例如:

array_fields = User.where("id > 5").limit(2) #return the array
array_fields.class #gives ActiveRecord::Relation and not Array

答案 1 :(得分:0)

您应该在控制台中打印对象的类和祖先,以确保该类符合您的期望。

从语法来看,它是一个方法调用,因此它可能有意想不到的类。

答案 2 :(得分:0)

def participation_earning(partcpnt_usr) 
 case partcpnt_usr
 when Array
   puts "***********Inside Array Statement - #{Time.now} *********"
   sleep 1
   show_participant_users.find do |show_prtcpnt_usr|
      show_prtcpnt_usr.show_participant_id == partcpnt_usr.participant_id
    end
  when ActiveRecord::Relation
   puts "***********Inside Relation Statement - #{Time.now} *********"
   sleep 1
   show_participant_users.where(:show_participant_id => partcpnt_usr.participant_id).first
  else
    puts "Will always go in else part"  
  end  
end