我有一些查询要根据skipped_play_id
选择所有数据,但是当我执行查询时,它仍会返回一些重复skipped_play_id
user = User.first
skipped_plays=user.user_skipped_plays.select(:skipped_play_id,:created_at).group(:created_at,:skipped_play_id)
如果我只需要按:created_at
分组的查询,为什么我应该将skipped_play_id
作为参数之一提供。如果我将查询更改为user.user_skipped_plays.select(:skipped_play_id,:created_at).group(:skipped_play_id)
它会返回
ActiveRecord::StatementInvalid: PG::GroupingError: ERROR: column "user_skipped_plays.created_at" must appear in the GROUP BY clause or be used in an aggregate function
LINE 1: SELECT "user_skipped_plays"."skipped_play_id", "user_skippe...
^
: SELECT "user_skipped_plays"."skipped_play_id", "user_skipped_plays"."created_at" FROM "user_skipped_plays" WHERE "user_skipped_plays"."user_id" = $1 GROUP BY "user_skipped_plays"."skipped_play_id" ORDER BY "user_skipped_plays"."id" ASC LIMIT $2
from /Users/fourtyonestudio/.rvm/gems/ruby-2.3.1/gems/activerecord-5.0.0.1/lib/active_record/connection_adapters/postgresql_adapter.rb:657:in `prepare
我真的很感激任何建议
答案 0 :(得分:0)
我认为您的代码根本不需要GROUP BY
。如果您需要选择仅包含skipped_play_id
和created_at
的唯一行,则可以使用:
user.user_skipped_plays.select(:skipped_play_id, :created_at).uniq
但是在这样的选择中,如果您有不同的行具有相同的skipped_play_id
但不同的skipped_play_id
,则仍然会重复created_at
,因为您采用了组合。所以,你可能需要选择:
user.user_skipped_plays.select(:skipped_play_id).uniq
这取决于你需要什么。您可以为我的答案输入评论,您打算如何使用此选项,我将帮助您解决问题
答案 1 :(得分:0)
请试试这个
User.first.user_skipped_plays.group_by { |t| t.skipped_play_id }
如果您收到正确的数据,请告诉我