导轨4中的参考功能

时间:2014-06-26 14:09:27

标签: ruby-on-rails-4

我只是不理解Rails 4中的新引用()函数 我在这里阅读定义:http://apidock.com/rails/ActiveRecord/QueryMethods/references

这是一个英语问题,但对我来说仍然不清楚。 这个新功能的目标是什么? (代码在没有它之前运行良好)。

我是否必须始终为includes()的每个表添加引用?

由于

3 个答案:

答案 0 :(得分:2)

使用includes时,Rails通常会单独加载结果。例如,如果你这样做

Post.includes(:comments)

它将发出一个查询来加载帖子,然后另一个用文章的post_id加载评论。

例如,如果您想要

,它将生成一个连接
Post.includes(:comments).where(comments: { user_id: 44})

其中一个条件依赖于相关表格。但是,如果您要使用

Post.includes(:comments).where('comments.user_id = ?', 44)

您将在Rails 4中收到错误。只要您使用SQL代码段在条件中引用关系,就必须使用references。要解决上述问题,我们会做

Post.includes(:comments).where('comments.user_id = ?', 44).references(:comments)

另一个选择当然是不在条件中使用SQL代码片段,就像第二个代码示例一样,但并不总是可以避免它们。

答案 1 :(得分:1)

我认为这适用于您渴望加载关联并且您正在使用字符串条件时。因为Rails不想在where子句中解析原始SQL以找出你正在做的事情,所以references旨在使你的查询更加明确。

Group.includes(:users).where('users.first_name = ?', 'John')

如果你这样做,你应该得到某种弃用警告。但是如果你使用哈希语法,你就不应该得到弃用警告:

Group.includes(:users).where(users: { first_name: 'John' })

因此,要在第一个上修复弃用警告,您可以向其添加references(:users)

Group.includes(:users).where('users.first_name = ?', 'John').references(:users)

答案 2 :(得分:0)

查询方法引用用于指示SQL字符串引用关联,因此可以通过单独加载来连接。从Rails 4.1开始,添加包含引用的字符串条件将导致引发异常。

以下示例选择所有拥有名为Nishant的成员的团队:

>> Team.includes(:members).where('members.name = ?', 'Nishant')
SQLite3::SQLException: no such column: members.name: SELECT "teams".*
FROM "teams" WHERE (members.name = 'Nishant')
ActiveRecord::StatementInvalid: SQLite3::SQLException: no such column:
members.name: SELECT "teams".* FROM "teams" WHERE (members.name =
'Nishant')
...

要使上面的示例在Rails 4.1中工作,我们必须包含带有要加入的关联名称的查询方法引用

Team.includes(:members).where("members.name = ?", 'Nishant').references(:members)

但是,如果您使用带有关联条件的哈希语法,它仍会执行LEFT OUTER JOIN而不会引发任何异常:

Team.includes(:members).where(members: { name: 'Nishant' })

请注意,在包含的关联上排序字符串SQL片段仍然可以在不需要的情况下以相同的方式工作 参考文献:

Team.includes(:members).order('members.name')

我希望这会对你有所帮助。