【问题标题】:How to convert ActiveRecord::QueryMethods::WhereChain to ActiveRecord_Relation如何将 ActiveRecord::QueryMethods::WhereChain 转换为 ActiveRecord_Relation
【发布时间】:2015-04-27 05:26:39
【问题描述】:

我今天有一个不典型的问题。我有需要阻塞的条件:

User.where do |user|
  user if Avatar.where(id: user.avatar_id).empty?
end.first

这会返回我:

NoMethodError: undefined method `first' for #<ActiveRecord::QueryMethods::WhereChain:0x0000000c672f08>

有没有办法将 ActiveRecord::QueryMethods::WhereChain 转换为 ActiveRecord_Relation?

【问题讨论】:

  • 不确定您要做什么,但where 不使用传递给它的块。 Rails 认为你在做 User.where.first,这是无效的

标签: ruby-on-rails ruby activerecord


【解决方案1】:

这应该为您提供User 的关系,其中User.avatar 不存在,您可以调用.first on

User.where(avatar_id: User.pluck(:avatar_id) - Avatar.pluck(:id))

【讨论】:

  • 注意这会导致 3 个数据库查询,我不确定我会这样做
【解决方案2】:

我会这样做:

User.where( Avatar.where("avatars.id = users.avatar_id").exists.not ).first

【讨论】:

    【解决方案3】:

    不应该这样工作吗?

    User.where(avatar_id: nil).first
    

    但如果出现问题,用户可能有一个 avatar_id,但具有该 ID 的 avatar 不存在,那么您可能想要做一些更长时间的事情

    User.where.not(id: Avatar.pluck(:user_id)).first
    

    PS:你不能链接User.where(通常),而是应该链接User.all

    【讨论】:

      【解决方案4】:

      您可以在 Rails 6 中使用 .select 代替 .where

      User.select do |user|
        user if Avatar.where(id: user.avatar_id).empty?
      end.first
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多