rails上的SQL查询

时间:2017-07-10 21:55:38

标签: sql ruby-on-rails ruby

我正在尝试查找列表中已完成的所有项目。我尝试在Todoitem模型中进行查询,但它显示[#<Todoitem id: nil>] 我做错了什么?

我认为的查询是:

Todoitem.find_by_sql("SELECT count(*) AS count_all FROM todoitems ti INNER JOIN todolists tl WHERE (ti.completed = 'true' AND ti.todolist_id = tl.id)")

我的模特是这样的:

class Todolist < ApplicationRecord
  belongs_to :user, required: false
  has_many :todoitems, dependent: :destroy
end

class Todoitem < ApplicationRecord
  belongs_to :todolist
end

2 个答案:

答案 0 :(得分:0)

要查找Todolist中已完成的所有项目,您的查询将起作用。 (我假设您将完成的布尔值存储为字符串,因为您在原始查询中使用了字符串)

但是,由于您只选择count(*) AS count_all,因此您必须从数组中的第一个元素中查看count_all,如下所示:

Todoitem.find_by_sql("SELECT count(*) AS count_all FROM todo....").first.count_all

这将在所有Todolist中返回一些已完成的todoitems。

更积极的记录方式是这样的:

Todolist.joins(:todoitems).where(todoitems:{completed:'true' }).count

要获取至少有一个已完成的待办事项的列表数量,您可以使用:

Todolist.joins(:todoitems).group(:id).where(todoitems:{completed:'true' }).length

要查找每个列表中已完成的项目数,您可以使用:

Todolist.joins(:todoitems).group(:id).where(todoitems:{completed:'true' }).count

这将返回一个散列,其中列表的id为键,已完成的项目数为值。

要获取特定任务中已完成项目的数量,您可以使用:

Todolist.joins(:todoitems).where(id: id, todoitems:{completed:'true' }).count

答案 1 :(得分:0)

你可以这样做。

Rails 5 - Postgresql

在此查询中,它仅显示todolist的{​​{1}}。

todoitems

另一个,这将仅显示Todolist.select('todolists.id, todolists.title, count(todoitems.todolist_id) as total').joins(:todoitems).group("todolists.id") 没有todolist结果的todoitems

0

我希望这对你有所帮助。