让我们有一个Rails 4.2.x应用程序,我们有两个表posts和authors,我们希望使用Arel来获得一个名为== 'Karl‘的作者编写的文章。(在本例中,我们可以很高兴地使用活动记录联接,但这只是为了保持示例的简单性。)
posts = Arel::Table.new :posts
authors = Arel::Table.new :authors
my_query = posts.project(Arel.star)
.join(authors)
.on(posts[:author_id].eq(authors[:id]))
.where(authors[:name].eq('Karl'))
> my_query.class
=> Arel::SelectManager现在,通过执行以下操作,我们可以获得(类数组的)帖子数组:
> Post.find_by_sql my_query
[master] Post Load (3.1ms) SELECT * FROM "posts" INNER JOIN "authors"
ON "posts"."author_id" = "authors"."id"
WHERE "authors"."name" = 'Karl'
=> [#<Post:0x005612815ebdf8
id: 7474,
...
]因此,我们确实得到了一组帖子,而不是一个活动记录关系:
> Post.find_by_sql(my_query).class
=> Array同时,将经理注入Post.where也是行不通的
> Post.where my_query
=> #<Post::ActiveRecord_Relation:0x2b13cdc957bc>
> Post.where(my_query).first
ActiveRecord::StatementInvalid: PG::SyntaxError:
ERROR: subquery must return only one column
SELECT "posts".* FROM "posts"
WHERE ((SELECT * FROM "posts" INNER JOIN "authors" ON "posts"."author_id" = "authors"."id" WHERE "authors"."name" = 'Karel'))
ORDER BY "posts"."id" ASC LIMIT 1我在想我一定是遗漏了什么。简而言之:如何从上面这样的select管理器(或另一个完成相同任务的select管理器)获得活动记录关系。
发布于 2017-03-17 08:21:22
您不能从Arel::SelectManager获得ActiveRecord::关系,也不能从sql字符串获得关系。通过ActiveRecord加载数据有两种方法:
在本例中,您可以使用my_query作为ActiveRecord::Relation
https://stackoverflow.com/questions/42840944
复制相似问题