【问题标题】:rails - find with condition in rails 4rails - 在rails 4中找到条件
【发布时间】:2014-12-09 20:07:16
【问题描述】:

我最近将 Rails 升级到 Rails 4.1.6。

这个查询曾经有效:

@user = User.find(:all, :conditions => { :name => 'batman' })

现在我收到此错误消息:

Couldn't find all Users with 'id': (all, {:conditions=>{:name=>"batman"}}) (found 0 results, but was looking for 2)

当我检查日志时,我可以看到 rails 正在尝试执行完全不同的查询:

User Load (0.4ms)  SELECT "users".* FROM "users"  WHERE "users"."id" IN ('all', '---
:conditions:
  :name: batman
')

看起来,它正在尝试获取 ID 为“all”和“{:conditions=>{:name=>"batman"}}”的所有用户。请帮忙。

更新:

我真正的问题是我想获得一个特定的用户并将他的汽车添加到其中,只有蓝色的汽车。例如这是我的查询,用户 id 是 20。

@user = User.joins(:cars).find(20, :cars => {:color => "blue"})

但我收到此错误:

无法找到所有具有 'id' 的用户:(20, {:cars=>{:color=>"blue"}}) (找到 41 个结果,但正在寻找 2 个)

【问题讨论】:

    标签: sql ruby-on-rails ruby find conditional-statements


    【解决方案1】:

    您绝对应该阅读此ActiveRecord Query Interface quide

    User.where(name: "batman")

    【讨论】:

    • 是的,有很多选择。这是关于这个问题的完整部分 - guides.rubyonrails.org/… 我真的鼓励你通读它,这些是 ActiveRecord 的基础知识,它将为你提供良好的基础
    • 嗨,Tome,是的,你是对的。我已经更新了我的帖子。现在你可以理解我为什么尝试这个查询了。
    • 如果您需要特定用户,请使用主键查找,例如以 ID 作为主键:Client.find(ID)
    • 是的,但这里的重点是我想进行一个查询并将另一个表连接到该客户端并设置一些条件...
    【解决方案2】:

    其他人已经指出:查询语法发生了变化。试试这个:

    @user = User.joins(:cars).where(:cars => { :color => "blue" }).find(20)
    

    请注意,如果找不到该记录,这将引发异常,以返回一个空数组而不是调用:

    @user = User.joins(:cars).where(:id => 20, :cars => { :color => "blue" })
    

    我建议阅读:http://guides.rubyonrails.org/active_record_querying.html


    如果您想加载用户,即使他没有任何汽车并且只显示他的蓝色汽车,我会这样做:

    @user = User.find(20)              # returns the user
    @user.cars.where(:color => 'blue') # returns the user's blue cars (or an empty array)
    

    【讨论】:

    • 谢谢你,这与我正在寻找的非常接近!现在唯一的事情是,当用户没有任何汽车时,即使用户 19 实际存在,我也会收到错误消息“找不到具有 'id'=19 的用户 [WHERE“汽车”。“颜色”=“蓝色“]”。如果用户没有汽车,我仍然希望能够获取他的信息并且只有一个空的“汽车”:[]
    • 感谢斯派克曼的帮助。我尝试了您的新查询,但收到此错误消息:未定义的方法“有效?”对于#<:relation>。 “如果找不到该记录,则返回空”我仍然想获取用户信息,例如电子邮件,姓名,......如果没有汽车“汽车”:[]
    【解决方案3】:

    find 方法在此版本的 Rails 中已弃用(请参阅the reference)。 相反,您必须使用where 方法。

    在你的情况下,你应该写@user = User(:name =&gt; 'batman')@user = User(name: 'batman')

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-04
      • 2013-11-12
      • 1970-01-01
      • 2011-02-15
      • 1970-01-01
      • 2014-09-11
      • 2011-02-14
      相关资源
      最近更新 更多