首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Rails教程3.2 Ch11 SQL语法

Rails教程3.2 Ch11 SQL语法
EN

Stack Overflow用户
提问于 2012-04-01 22:37:05
回答 1查看 331关注 0票数 1

我正在从rails教程中学习rails。我在Section 11.3.1中遇到了一个问题,清单11.44中的代码:

代码语言:javascript
运行
复制
def self.from_users_followed_by(user)
  followed_user_ids = user.followed_user_ids.join(', ')
  where("user_id IN (?) OR user_id = ?", followed_user_ids, user)
end

不会在followed_user_ids中返回user_id。

在stackoverflow上搜索后,我找到了解决方案here,它说只需删除"join“方法,它就能为我工作。

但我很好奇为什么在删除"join“方法之前运行RSPEC时没有出现错误。

在清单11.41中:

代码语言:javascript
运行
复制
subject { Micropost.from_users_followed_by(user) }

it { should include(own_post) }
it { should include(followed_post) }

如果"join“方法会使SQL语句出错,为什么要通过RSPEC呢?

有没有人有同样的问题?

更新2012.04.03

我使用rails控制台来检查这个问题。

代码语言:javascript
运行
复制
user = User.first
ids = ids = user.following_users.map(&:id).join(', ')

它得到了

代码语言:javascript
运行
复制
User Load (2.6ms)  SELECT "users".* FROM "users" INNER JOIN "follows" ON
"follows"."followable_id" = "users"."id" AND "follows"."followable_type" = 'User' WHERE    
"follows"."blocked" = 'f' AND "follows"."follower_id" = 1 AND "follows"."follower_type" 
= 'User' AND "follows"."followable_type" = 'User'
=> "6, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 21, 22, 23, 24, 25, 26, 27, 28, 29,    
30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 
52, 55, 56, 5"

然后是SQL

代码语言:javascript
运行
复制
Collection.where("user_id IN (?)", ids)

结果是

代码语言:javascript
运行
复制
Collection Load (0.7ms)  SELECT "collections".* FROM "collections" WHERE (user_id IN 
('6, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 21, 22, 23, 24, 25, 26, 27, 28, 29, 
30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 
52, 55, 56, 5')) ORDER BY collections.created_at DESC
=> []

这将返回一个空数组。

但我所有的rspec都通过了。还是不知道。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-04-01 22:54:38

假设连接创建了一个字符串'1,2,3',那么您可能希望使用join("','")来拥有('1','2','3'),但我认为这不会起作用--我敢肯定PostgreSQL不喜欢ID作为字符串。

或者:

Squeel是一个很好的SQL语法gem,您可以在其中使用:

代码语言:javascript
运行
复制
user = User.first
ids = user.following_users.map(&:id)
Collection.where{(user_id.like_any ids)}

这将允许您传入整数数组,并且Squeel将设置查询,其中:

代码语言:javascript
运行
复制
SELECT "collections".* FROM "collections" WHERE (("collections"."user_id" LIKE 1 OR "collections"."user_id" LIKE 2 OR "collections"."user_id" LIKE 3))

编辑:您还可以使用以下语法:

代码语言:javascript
运行
复制
ids = User.first.following_users.pluck(:id)
Collection.find_by_user_id(ids)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9965197

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档