Ruby on rails 如何为Rails中不同表上的条件创建has_many_和would_to association?
我有一个用户表格,用于Ruby on rails 如何为Rails中不同表上的条件创建has_many_和would_to association?,ruby-on-rails,ruby,ruby-on-rails-3,devise,associations,Ruby On Rails,Ruby,Ruby On Rails 3,Devise,Associations,我有一个用户表格,用于用户模型,该表格是通过designe创建的,角色表格用于角色模型。用户和角色都与HABTM相关 roles: id: integer name: string roles_users: user_id:integer roles_id:integer 我有三个角色:管理员、经理和记者 现在,我创建了一个团队模型,如下所示: teams: name: string 我希望一个团队有多个经理 因此,如果我创建一个团队: t = Team.create(name: 'Foo
用户
模型,该表格是通过designe创建的,角色表格用于角色模型。用户
和角色
都与HABTM相关
roles:
id: integer
name: string
roles_users:
user_id:integer
roles_id:integer
我有三个角色:管理员、经理和记者
现在,我创建了一个团队
模型,如下所示:
teams:
name: string
我希望一个团队有多个经理
因此,如果我创建一个团队:
t = Team.create(name: 'Football')
然后,我想找到所有管理“足球”团队的经理(角色为“经理”的用户)。所以,我在团队和用户之间创建了HABTM
teams_users:
team_id:integer
user_id:integer
我需要一个关联:managers
insideTeam
model。但是,到目前为止,此代码不起作用:
class Team < ActiveRecord::Base
attr_accessible :name
validates :name, presence: true
has_and_belongs_to_many :managers, class_name: 'User', association_foreign_key: 'user_id', conditions: joins(:roles, :roles_users).where('roles_users.role_id = ?', Role.select('id, name').find_by_name('manager').id)
end
我做错了什么?有什么建议吗?按如下方式设置关联:
has_and_belongs_to_many :managers, class_name: 'User',
association_foreign_key: 'user_id',
include: :roles,
conditions: ['roles_users.role_id = ?', Role.select('id, name').find_by_name('manager').id]
由于在团队上未找到名为“角色”的关联,您将收到此错误,因为您试图调用角色
和角色的关联。\u用户
在团队
上(使用条件
选项),并且团队
与它们都不关联
在这种情况下,您需要使用include
选项指定二阶关联,以便角色的关联应用于用户
表,而不是团队
什么不起作用?你从t.managers那里得到了什么?它与您的预期输出有何不同?请参阅更新的问题。我已经添加了错误跟踪。是的,差不多了。唯一的问题是它给出了这个错误:ActiveRecord::StatementInvalid:Mysql2::error:where子句中的未知列“roles\u users.role\u id”:从团队的where(roles\u users
.role\u id=2)中选择COUNT(*)。它将“roles\u users.role\u id”作为一个整体列。有什么想法吗?没关系。我让它工作了。谢谢你的帮助。更新此:has_和_-belish_-to_-many:managers,class_-name:'User',association_-foreign_-key:'User_-id',包括:[:roles],条件:['roles_-users.role_-id=?',role.select('id,name')。在代码中按_-name('manager').id]
查找,以便我可以接受它作为最终答案。再次感谢您指出包含
选项,我完全错过了它。很好!现在您还可以直接指定include::roles
而不是include:[:roles]
您也需要删除where
子句。因为它是第一级活动记录查询。因此,它将roles\u users.role\u id
视为一列。请在你的答案中更新它。
has_and_belongs_to_many :managers, class_name: 'User',
association_foreign_key: 'user_id',
include: :roles,
conditions: ['roles_users.role_id = ?', Role.select('id, name').find_by_name('manager').id]