我有一个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表。
我怎样才能从另外两个表中获取数据?
我可以通过在开头添加.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")