在Ruby中,如果给定一些条件,使用ActiveRecord检索属于父对象的对象的最佳方法是什么?

在Ruby中,如果给定一些条件,使用ActiveRecord检索属于父对象的对象的最佳方法是什么?,ruby,activerecord,active-record-query,Ruby,Activerecord,Active Record Query,在我的模型中,组织有多个:用户,用户有多个:角色,角色有一个名称和有多个:用户 在我的organization类中,我有一个方法get\u admin,该方法应该可以获取属于该组织的用户,该用户具有角色'admin'。像这样: def get_admin return self.users.with_role('admin') end 唉,这将返回一个ActiveRecord::Relation对象,而不是用户 我试着像这样把.first附加到行的末尾 def get_admin re

在我的模型中,
组织
有多个:用户
用户
有多个:角色,
角色
有一个
名称
有多个:用户

在我的
organization
类中,我有一个方法
get\u admin
,该方法应该可以获取属于该
组织的
用户,该用户具有
角色
'admin'
。像这样:

def get_admin
  return self.users.with_role('admin')
end
唉,这将返回一个
ActiveRecord::Relation
对象,而不是
用户

我试着像这样把
.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
如何重写
组织
get_admin
方法(如下所示)以返回实际的
用户

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


Dave

在用户模型中创建一个名为admin的作用域

user.rb:

scope :admin, joins(:role).where('roles.name = ?', 'admin')
get_admin方法应该是

def get_admin
  return self.users.admin.first
end

在用户模型中创建一个名为admin的作用域

user.rb:

scope :admin, joins(:role).where('roles.name = ?', 'admin')
get_admin方法应该是

def get_admin
  return self.users.admin.first
end

发布您的模型详细信息不仅仅是模式,这有助于了解发生了什么。大概with_角色是您在用户类上定义的范围。如果没有看到这个方法,你的问题是不可能回答的。是的,很抱歉,我应该在
user.rb
中添加一个作用域:使用_role,lambda{r}{:conditions=>['role.name==?',r]}发布模型详细信息,而不仅仅是模式,这有助于了解发生了什么。大概with_角色是您在用户类上定义的范围。如果没有看到这个方法,你的问题是不可能回答的。是的,对不起,我应该在
user.rb
中添加一个作用域:使用{u role,lambda{r}{:conditions=>['role.name==?',r]},而Dexter显然是正确的,通过这种方法,你可能会有不止一个人认为他们应该是一个组织的管理员,但系统只会根据id顺序选择第一个。另一种解决方案是在Organizations表中添加一个名为admin\u user\u id的列,并显式指定管理员。您可以指定他们必须具有具有条件或方法的管理员角色。虽然Dexter显然是正确的,但通过这种方法,您可能会遇到多个认为他们应该是组织管理员的人,但系统仅根据id顺序选择第一个。另一种解决方案是在Organizations表中添加一个名为admin\u user\u id的列,并显式指定管理员。您可以指定他们必须具有具有条件或方法的管理员角色。