sql - Rails 包含条件

  显示原文与译文双语对照的内容
0 0

是填在Rails > 3 .2将条件添加到联接语句生成的 includes方法?

假设我有两个模型,人和Note 。 每个人都有很多说明和每个便笺属于一个人。 每个注释都有一个属性 important.

我想查找所有人民的预加载只说明重要。 SQL中为:

SELECT *
FROM people
LEFT JOIN notes ON notes.person_id = people.id AND notes.important = 't'

在Rails类似,唯一的办法就是使用 includes( note: joins不会预加载说明) 如下所示:

Person.includes(:notes).where(:important, true)

但是,将生成以下SQL查询它返回不同的结果集:

SELECT *
FROM people
LEFT JOIN notes ON notes.person_id = people.id
WHERE notes.important = 't'

请注意第一个结果集包含所有的人和第二个只有相关的人员的重要说明。

还要注意:conditions被否决,因为3 .1 。

时间:原作者:5个回答

0 0

根据本指南 Active Record Querying

你可以指定条件包括这样立即加载找

Person.includes(:notes).where("notes.important", true)

它还建议使用 joins这样。

这将创建另一个关联的解决方法是这样的

class Person < ActiveRecord::Base
  has_many :important_notes, :class_name => 'Note', 
           :conditions => ['important = ?', true]
end

然后你就能这样做

Person.find(:all, include: :important_notes)
原作者:
0 0

一种方法是编写自己的LEFT JOIN子句使用联接:

Person.joins('LEFT JOIN "notes" ON "notes"."person_id" = "people.id" AND "notes"."important" IS "t"')

不漂亮,虽然。

原作者:
...