Rails 3 DISTINCT QUERY

Joh*_*ohn 22 ruby-on-rails ruby-on-rails-3

拥有User,UserBadge和Badge表.它们通过has_many连接.用户可以拥有多个相同的徽章,但我想查询唯一的列表.

@user.badges.select("DISTINCT id").order("created_at DESC")
Run Code Online (Sandbox Code Playgroud)

这是一个错误:

SQLite3::SQLException: near "DISTINCT": syntax error:
Run Code Online (Sandbox Code Playgroud)

什么是正确的语法?

编辑:添加整个错误

SQLite3::SQLException: near "DISTINCT": syntax error: SELECT "badges".*, DISTINCT badges.id FROM "badges" INNER JOIN "userbadges" ON "badges".id = "userbadges".badges_id WHERE (("userbadges".user_id = 1))
Run Code Online (Sandbox Code Playgroud)

可能是select和distinct之间的逗号吗?

Mik*_*ike 27

在SELECT之后,DISTINCT需要笔直

SELECT DISTINCT(badges.id), "badges".* FROM "badges" INNER JOIN "userbadges" ON "badges".id = "userbadges".badges_id WHERE (("userbadges".user_id = 1))
Run Code Online (Sandbox Code Playgroud)

尝试:

@user.select("DISTINCT(badges.id), badges.*").badges.order("badges.created_at DESC")
Run Code Online (Sandbox Code Playgroud)

PostgreSQL要求您拥有distinct字段的订单声明:

@user.select("DISTINCT(badges.id), badges.*").badges.order("badges.id").order("badges.created_at DESC")
Run Code Online (Sandbox Code Playgroud)

  • 感谢PostreSQL这样做的方法.:) (3认同)

Kel*_*end 21

可以尝试使用组

@user.badges.group(:id)
Run Code Online (Sandbox Code Playgroud)

  • 哎呀,没关系.这不适用于PostgreSQL. (6认同)

ric*_*ock 7

:uniq => true
Run Code Online (Sandbox Code Playgroud)

关于协会.或者仅为用户​​的唯一徽章创建单独的关联.

http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#method-i-has_many

就像是

Class User < ActiveRecord::Base
  has_many :user_badges
  has_many :badges, :through => :user_badges
  has_many :unique_badges, :through => :user_badges, :source => :badges, :uniq => true
  #untested
end
Run Code Online (Sandbox Code Playgroud)

  • 为什么这不会有更多的赞成?所有其他答案似乎都是倒退和过于复杂的,这很好. (2认同)

fl0*_*00r 4

尝试这个

@user.badges.select("DISTINCT(badges.id)").order("badges.created_at DESC")
Run Code Online (Sandbox Code Playgroud)