В Ruby с ActiveRecord, каков наилучший способ получить объект, принадлежащий родительскому объекту, при определенных условиях? - PullRequest
1 голос
/ 30 августа 2011

В моей модели Organisation has_many :users, а User has_and_belongs_to_many :roles и Role имеет name и has_and_belongs_to_many :users.

В моем Organisation классе Iесть метод get_admin, который должен получить User, принадлежащий тому Organisation, который имеет Role 'admin'.Вот так:

def get_admin
  return self.users.with_role('admin')
end

Увы, это возвращает ActiveRecord::Relation объект, а не User.

Я попытался добавить .first в конец строки, например,

def get_admin
  return self.users.with_role('admin').first
end

Но тогда все, что я получаю, это ошибка SQL

ActiveRecord::StatementInvalid: SQLite3::SQLException: no such column: role.name: SELECT  "users".* FROM "users" WHERE ("users".organisation_id = 2) AND (role.name == 'admin') LIMIT 1

Моя схема определена так:

create_table "roles", :force => true do |t|
  t.string "name", :null => false
end

create_table "users", :force => true do |t|
  t.string  "username",                              :null => false
  t.integer "organisation_id"
end

create_table "roles_users", :id => false, :force => true do |t|
  t.integer "user_id"
  t.integer "role_id"
end

create_table "organisations", :force => true do |t|
  t.string  "name",                                    :null => false
  t.string  "website",                                 :null => false
end

Как бы я переписал Organisation s get_admin метод (как показано ниже) для возврата фактического User?

def get_admin
  return self.users.with_role('admin')
end

Cheers

Dave

1 Ответ

1 голос
/ 30 августа 2011

Создайте область с именем admin в модели Users

user.rb:

scope :admin, joins(:role).where('roles.name = ?', 'admin')

И метод get_admin должен быть

def get_admin
  return self.users.admin.first
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...