帮助HABTM查询(Rails 3)

时间:2011-03-18 03:53:24

标签: mysql sql ruby-on-rails-3 activerecord

我有以下型号:

#user.rb
class User < ActiveRecord::Base
  has_and_belongs_to_many :groups
end

#group.rb
class Group < ActiveRecord::Base
  has_and_belongs_to_many :users
end

#join table migration
class CreateGroupUserJoinTable < ActiveRecord::Migration
  def self.up
    create_table :groups_users, :id => false do |t|
      t.integer :user_id
      t.integer :group_id
    end
  end

  def self.down
    drop_table :groups_users
  end
end

我需要进行以下查询:

@group = Group.find(:all, :include => users, :conditions => ["users count < ?", group_size]).first

但是这给了我以下错误:

SQLite3::SQLException: near "count": syntax error: SELECT "groups".* FROM "groups" WHERE (users count < 2) LIMIT 1

我也试过这个:

@group = Group.where("users count < ?", group_size).first

但我得到同样的错误。我做错了什么?

2 个答案:

答案 0 :(得分:1)

Group.select("groups.*, count(users.id) AS user_count").joins(:users).group("groups.id").having(["count(users.id) < ?", group_size])

我认为这可能会为你做到......

答案 1 :(得分:0)

users.count就是您所需要的 - 请注意您留下了空间。您收到语法错误,而不是一些奇怪的错误。

@group = Group.find(:all,
                    :include => users,
                    :conditions => ["users.count < ?", group_size]).first

现在,如果您真的只想要第一个条目,那么您应该这样做:

@group = Group.first(:include => users,
                     :conditions => ["users.count < ?", group_size])

请注意,我正在呼叫#first,而不是#find。很快就会弃用#find - 请改为使用#all#first