Помощь с запросом HABTM (Rails 3) - PullRequest
0 голосов
/ 18 марта 2011

У меня есть следующие модели:

#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 ]

1 голос
/ 18 марта 2011
Group.select("groups.*, count(users.id) AS user_count").joins(:users).group("groups.id").having(["count(users.id) < ?", group_size])

Я думаю, это, вероятно, сделает это за вас ...

0 голосов
/ 18 марта 2011

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 вместо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...