Rails 3/Ruby:ActiveRecord查找方法IN条件数组到参数单引号问题

Sch*_*ann 30 ruby activerecord ruby-on-rails-3

我在微博模型上创建了一个方法,它采用了一组user_ids.在这个方法中,我使用以下'find'方法为数组中的所有用户提取所有帖子.

find(:all, :conditions => ["user_id IN (?)", args.join(',')])
Run Code Online (Sandbox Code Playgroud)

但是,当ActiveRecord为此查询生成SQL时,它以单引号括起逗号分隔的Ids列表.这会导致查询仅为单引号内的第一个数字而不是所有数字提取帖子.

SELECT `microposts`.* FROM `microposts` WHERE (user_id IN ('3,4,5')) ORDER BY microposts.created_at DESC
Run Code Online (Sandbox Code Playgroud)

查询应该看起来像这样才能正常工作,但我无法弄清楚如何让Ruby将数组转换为没有引号的昏迷分隔列表,我知道它必须是简单的东西,我只是想念它并且可以'在Google上找到修复此问题的任何内容.我发现的所有帖子都使用相同的.join(',')方法来对齐Array.

SELECT `microposts`.* FROM `microposts` WHERE (user_id IN (3,4,5)) ORDER BY microposts.created_at DESC
Run Code Online (Sandbox Code Playgroud)

还有一个事实是帮助你弄清楚我的问题是我正在以下面的方式构建我传入方法的数组.不确定这是否会影响事情.

ids = Array.new
ids.push(current_user.id)
ids = ids + current_user.friends.map(&:id)
ids = ids + current_user.reverse_friends.map(&:id)
Run Code Online (Sandbox Code Playgroud)

在此先感谢能帮我恢复工作的人;)

gha*_*yes 72

回答更新(两次)以反映Rails 3+ ActiveRecord语法

Rails 3+

您可以使用以下语法:

Post.where(user_id: [1,2,3])
Run Code Online (Sandbox Code Playgroud)

因此:

Post.where(user_id: args)
Run Code Online (Sandbox Code Playgroud)

导轨3或导轨4(原件)

为了完整起见,Rails 3语法将是:

Post.where("user_id IN (?)", [1,2,3]).to_a
Run Code Online (Sandbox Code Playgroud)

如果args是Array,那么:

Post.where("user_id IN (?)", args).to_a
Run Code Online (Sandbox Code Playgroud)

或者,如果args是一个字符串数组:

Post.where("user_id IN (?)", args.map(&:to_i)).to_a
Run Code Online (Sandbox Code Playgroud)

to_a是可选的,但将返回的结果为数组.希望这可以帮助.

Rails 2

您应该能够简单地传入一个数组作为参数,如下所示:

find(:all, :conditions => ["user_id IN (?)", [1,2,3] ] )
Run Code Online (Sandbox Code Playgroud)

因此,如果args是一个id数组,你应该简单地调用:

find(:all, :conditions => ["user_id IN (?)", args ] )
Run Code Online (Sandbox Code Playgroud)

如果您遇到类型问题,您可以:

find(:all, :conditions => ["user_id IN (?)", args.map { |v| v.to_i } ] )
Run Code Online (Sandbox Code Playgroud)

这将确保数组中的每个项都是一个整数.


sq1*_*020 20

在rails 3和4中,你也可以简单地将数组作为参数传递,如下所示:

Post.where(:user_id => [1,2,3])
Run Code Online (Sandbox Code Playgroud)

这将给你相同的结果

Post.where("user_id IN (?)", [1,2,3])
Run Code Online (Sandbox Code Playgroud)