我只是不理解Rails 4中的新引用()函数 我在这里阅读定义:http://apidock.com/rails/ActiveRecord/QueryMethods/references
这是一个英语问题,但对我来说仍然不清楚。 这个新功能的目标是什么? (代码在没有它之前运行良好)。
我是否必须始终为includes()的每个表添加引用?
由于
答案 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')
我希望这会对你有所帮助。