环境 - 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。任何人都可以解释为什么会这样吗?
答案 0 :(得分:0)
根据导轨api:
Scope添加用于检索和查询对象的类方法。该方法旨在返回ActiveRecord :: Relation对象,该对象可与其他作用域组合。如果返回nil或false,则返回所有范围。
所以这不是意料之外的,而是一种确切的预期行为。您的范围返回false
,它应用all
范围并转储所有Appliance
个记录,这些记录是activerecord relation
个对象,如api中所述。