我直接使用此查询并希望使用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
我很想知道的部分是如何创建/将子选择作为表/模型?
答案 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()