【问题标题】:Unexpected output in rails when using scopes使用范围时,rails 中的意外输出
【发布时间】:2017-05-30 21:30:47
【问题描述】:

环境 - Rails 4.2、Ruby 2.3

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

细分:

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(main):007:0> Appliance.superuser(current_user)

=> 是的

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) SELECT "appliances".* FROM "appliances"

=>#ActiveRecord::Relation [#Appliance id:1, ... updated_at: "...">, #Appliance id:2, ... updated_at: "...">]>

基本上它是转储 Appliance.all 并返回 ActiveRecord_relation 而不是 false。谁能解释为什么会这样?

【问题讨论】:

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


    【解决方案1】:

    按照轨道api

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

    所以这并不意外,而是完全预期的行为。您的作用域返回false,它应用all 作用域并转储所有Appliance 记录,即activerecord relation 对象,如api 所述。

    【讨论】:

    • 谢谢,我记得读过,但我想我没有完全理解。
    • 没问题。有时,也会发生在我身上。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-28
    • 1970-01-01
    • 2011-06-28
    • 1970-01-01
    • 1970-01-01
    • 2018-06-23
    • 1970-01-01
    相关资源
    最近更新 更多