Rails写这个Mysql查询的方式

时间:2012-03-08 11:09:02

标签: mysql activerecord ruby-on-rails-3.1

我有一个Mysql查询:

actors_to_delete = find_by_sql("SELECT * FROM `dvd_role` a
LEFT JOIN `dvd_actor2role` b ON a.id = b.`roleId`
LEFT JOIN `dvd_actor` c ON b.`actorId` = c.`id`
WHERE role LIKE '%uncredited%'
GROUP BY c.id")

我用这样的Railsy方式写了它:

actors_to_delete = Role.joins("LEFT JOIN `dvd_actor2role` ON dvd_role.id = dvd_actor2role.`roleId`").joins("LEFT JOIN `dvd_actor` ON dvd_actor2role.`actorId` = dvd_actor.`id`").where("dvd_role.role LIKE '%uncredited%'").group("dvd_actor.id")

我在想什么(除了这两个查询之间真正区别的事实,它们都做同样的事情,所以为什么赞成Railsy方式而不是更直接的sql方式?)我是怎么写的它与已经在Rails中建立的关系。

如果我尝试做这样的事情:

Actor.actor2role.role.where("role LIKE ?", '%uncredited%')

我将获得未定义的方法actor2role,因为即使已经在Rails中建立了关系,它们也适用于Actor的实例,而不是模型本身。

所以,总之,只是想知道最好的方法是什么。来自PHP和Mysql我倾向于用sql方式编写很多这些东西,并试图改变我的邪恶方式:)

修改

我还有另一个问题,那就是在sql查询中我得到了所有3个表中的所有信息,Rails方式由于某种原因只给了我dvd_role表。

如何从其他2表中获取数据?

我可以通过在开头添加.select(“*”)来完成后者。这是合适的方式:

actors_to_delete = Role.select("*").joins("LEFT JOIN `dvd_actor2role` ON dvd_role.id = dvd_actor2role.`roleId`").joins("LEFT JOIN `dvd_actor` ON dvd_actor2role.`actorId` = dvd_actor.`id`").where("dvd_role.role LIKE '%uncredited%'").group("dvd_actor.id")

0 个答案:

没有答案