首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Arel: Arel::SelectManager与join的主动关系

Arel: Arel::SelectManager与join的主动关系
EN

Stack Overflow用户
提问于 2017-03-16 17:28:02
回答 1查看 5.3K关注 0票数 8

让我们有一个Rails 4.2.x应用程序,我们有两个表posts和authors,我们希望使用Arel来获得一个名为== 'Karl‘的作者编写的文章。(在本例中,我们可以很高兴地使用活动记录联接,但这只是为了保持示例的简单性。)

代码语言:javascript
复制
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

现在,通过执行以下操作,我们可以获得(类数组的)帖子数组:

代码语言:javascript
复制
> 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,
    ...
   ]

因此,我们确实得到了一组帖子,而不是一个活动记录关系:

代码语言:javascript
复制
 > Post.find_by_sql(my_query).class
 => Array

同时,将经理注入Post.where也是行不通的

代码语言:javascript
复制
> 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管理器)获得活动记录关系。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-17 08:21:22

您不能从Arel::SelectManager获得ActiveRecord::关系,也不能从sql字符串获得关系。通过ActiveRecord加载数据有两种方法:

  1. 在Arel中执行所有查询逻辑。在本例中,您不能使用任何ActiveRecord::Relation方法。但在Arel中也有相同的功能。在您的示例中,您可以通过Arel设置限制: my_query.take(10)
  2. 其他方法是在ActiveRecord::Relation方法中使用Arel。您可以这样重写查询: posts = Arel::Table.new :posts = Arel::Table.new :authors join =posts.join(作者)。on(posts:author_id.eq(作者:id))。join_sources my_query = Post.加入(加入)其中(authors:name.eq(‘Karl’))> my_query.class => ActiveRecord::关系

在本例中,您可以使用my_query作为ActiveRecord::Relation

票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42840944

复制
相关文章

相似问题

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