使用示波器时轨道中的意外输出

时间:2017-01-16 04:58:50

标签: ruby-on-rails ruby-on-rails-4

环境 - Rails 4.2,Ruby 2.3

尝试使用范围并创建一个将从非用户模型/控制器内部为current_user的user.superuser返回true或false的范围。当current_user.superuser = true时,我得到预期的输出,但是假的只是左边的字段。

故障:

appliance.rb(型号)

scope :superuser, ->(user) { user.superuser ? true : false }

appliance_controller.rb

def list
  @appliances = Appliance.all.order(:idtag)
  @users = User.all
end

list.html.haml

%h5
  = "Is the user a superuser? #{Appliance.superuser(current_user).to_s}"

Rails控制台,用于查询超级用户属性设置为true的用户

irb(main):006:0* current_user = User.first   User Load ... #<User id: 3, superuser: true>
  

IRB(主):007:0&GT; Appliance.superuser(CURRENT_USER)

     

=&GT;真

Rails控制台,用于查询超级用户属性设置为false的用户

irb(main):008:0> current_user = User.last User Load # User id: 6, superuser: false>
  

irb(main):010:0 * Appliance.superuser(current_user)

     

设备负载(4.1ms)选择“设备”。* FROM“设备”

     

=&gt; #ActiveRecord :: Relation [#Appliance id:1,... updated_at:“...”&gt;,#apply id:2,... updated_at:“...”&gt;] &GT;

基本上它正在转储Appliance.all并返回ActiveRecord_relation而不是false。任何人都可以解释为什么会这样吗?

1 个答案:

答案 0 :(得分:0)

根据导轨api

  

Scope添加用于检索和查询对象的类方法。该方法旨在返回ActiveRecord :: Relation对象,该对象可与其他作用域组合。如果返回nil或false,则返回所有范围。

所以这不是意料之外的,而是一种确切的预期行为。您的范围返回false,它应用all范围并转储所有Appliance个记录,这些记录是activerecord relation个对象,如api中所述。