我有一个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")