即使数据库条目存在,也无法找到它

时间:2014-11-19 20:41:14

标签: ruby-on-rails postgresql

所以我试图查询一个可以有很多喜欢和评论的媒体。

我现在尝试使用的代码是:medium = Medium.joins(:comments, :likes).find(params[:id])

这会抛出错误:Couldn't find medium with 'id'=2

如果我从join子句中删除:likes,它将成功找到介质(实际存在id为2 DOES的介质)。

错误的查询:

  

Medium Load (0.1ms) SELECT "media".* FROM "media" INNER JOIN "likes" ON "likes"."medium_id" = "media"."id" INNER JOIN "comments" ON "comments"."medium_id" = "media"."id" WHERE "media"."id" = $1 LIMIT 1 [["id", 2]]

工作查询:

  

Medium Load (0.1ms) SELECT "media".* FROM "media" INNER JOIN "comments" ON "comments"."medium_id" = "media"."id" WHERE "media"."id" = $1 LIMIT 1 [["id", 2]]

这可能是什么问题?

1 个答案:

答案 0 :(得分:1)

问题的最可能原因是id为2的媒体没有任何相关的喜欢。 join方法生成一个带有INNER JOIN到给定表的SQL语句,除非两个表中都有记录,否则不会返回任何结果。

这里你真正需要的是一个SQL LEFT OUTER JOIN,这样即使“右手”表(喜欢)中没有相应的记录,也会返回“左”表(媒介)中的记录,例如:

Medium.joins(:comments).
  joins('LEFT OUTER JOIN likes ON likes.medium_id = mediums.id').
  find(params[:id])

如果这也是一个可选关联,您可能还需要对comments的联接执行相同的操作。