我如何在ActiveRecord中实现它

时间:2013-07-18 14:36:32

标签: ruby activerecord

我直接使用此查询并希望使用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

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

1 个答案:

答案 0 :(得分:1)

这里的一个问题是您尝试根据要求为null的列(pid)对表执行连接。您无法加入NULL值。但是,如果这是一个错误并且您想要加入NULL pid值,那么等效的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()