Rails group by query仍然返回重复记录

时间:2017-11-27 05:08:57

标签: ruby-on-rails activerecord

我有一些查询要根据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

我真的很感激任何建议

2 个答案:

答案 0 :(得分:0)

我认为您的代码根本不需要GROUP BY。如果您需要选择仅包含skipped_play_idcreated_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 }

如果您收到正确的数据,请告诉我

相关问题