0

我直接使用这个查询并想使用 ActiveRecord,

SELECT count(*)
  FROM p
       LEFT JOIN
          (SELECT pid
             FROM s LEFT JOIN i ON s.key = i.sid
            WHERE i.default = 'y') AS table_x
       ON p.pid = table_x.pid WHERE isnull(table_x.pid) AND p.show = 'y'

但我不太确定如何实现上述内容。我到目前为止的定义如下。

class P < ActiveRecord::Base
  has_many :s, :foreign_key => 'pid'
  has_many :i, :through => :s
end


class S < ActiveRecord::Base
  belongs_to :p, :foreign_key => 'pid' 
  has_many :i, :foreign_key => 'sid' 
end

class I < ActiveRecord::Base
  belongs_to :s, :foreign_key => 'sid'
  belongs_to :p, :through => :s
end

我很想知道的部分是关于如何创建/将子选择作为表/模型?

4

1 回答 1

1

这里的一个问题是您正在尝试根据pid您要求为空的列 ( ) 对表执行联接。您不能加入 NULL 值。但是,如果这是一个错误并且您不想连接 NULLpid值,那么等效的 SQL 语句将如下所示(假设s表包含pid,而不是i):

SELECT count(*) FROM p 
LEFT JOIN s ON s.pid=p.pid 
LEFT JOIN i ON s.key=i.sid 
WHERE i.default='y' AND p.show = 'y'

此查询很容易转换为 ActiveRecord,因为您可以简单地使用由.joins()方法连接的.where()方法。也许这样的事情对你有用:

P.joins(:s => :i).where('i.default = ?', 'y').where('p.show = ?', 'y').count()
于 2013-07-18T17:34:04.960 回答