代码之家  ›  专栏  ›  技术社区  ›  Harish Shetty

在中使用SQL条件时ActiveRecord Finder中的奇怪行为

  •  2
  • Harish Shetty  · 技术社区  · 14 年前

    我有张叫的桌子 inbox_messages 包含以下行:

    user_id message_id
    ======= ==========
    4       8
    4       1
    4       7
    0       9
    0       10
    0       11
    0       12
    

    该表映射到以下模型:

    class InboxMessage < ActiveRecord::Base
    end
    

    当我调用 find 方法与A IN Caluse,我会根据位置得到不同的结果集 参数。

    InboxMessage.find(:all, :conditions => [ "user_id IN (?)", "0,4"]) # 8 rows
    InboxMessage.find(:all, :conditions => [ "user_id IN (?)", "4,0"]) # 3 rows
    

    上面的第二个调用,返回3行而不是8行。其他情况也可以,即

    InboxMessage.find(:all, :conditions => [ "user_id IN (0, 4)" ]) # 8 rows
    InboxMessage.find(:all, :conditions => [ "user_id IN (4, 0)" ]) # 8 rows
    InboxMessage.find(:all, :conditions => [ :user_id => [0, 4]  ]) # 8 rows
    InboxMessage.find(:all, :conditions => [ :user_id => [4, 0]  ]) # 8 rows
    
    2 回复  |  直到 14 年前
        1
  •  4
  •   Larry K    14 年前

    问题是该文本作为单个文本传递到SQL语句中。

    InboxMessage.find(:all, :conditions => [ "user_id IN (?)", "0,4"])
    becomes Select ... WHERE (user_id IN ('4,0'))
    

    尝试使用两个替换,它将按您的期望工作

    InboxMessage.find(:all, :conditions => [ "user_id IN (?, ?)", 0,4])
    becomes Select ... WHERE (user_id IN (4,0))
    

    通过在开发模式中查看日志,可以看到实际的SQL语句是什么。

        2
  •  0
  •   Peter Brown    14 年前

    这是我喜欢使用的另一种形式,因为我发现它更具可读性:

    InboxMessage.find_all_by_user_id([0,4])