我有三个模型Role
,Action
和RoleAction
以及一些代码:
class Role < ActiveRecord::Base
has_many :users
has_many :actions, -> {where role_actions:{status: 1}}, :through => :roleActions
has_many :actions, :through => :roleActions #other context(manager, etc...)
has_many :roleActions
end
class Action < ActiveRecord::Base
has_many :actions, foreign_key: 'parent_id'
has_many :roleActions
has_many :roles, through: :roleActions
end
class RoleAction < ActiveRecord::Base
belongs_to :role
belongs_to :action
end
当我使用role.actions
时,会在role_actions中获得role
和status == 1
的操作。
但我希望当我使用role.actions("manager")
(“经理”是上下文名称)时,将返回角色的所有操作。
我该怎么办?
谢谢!
答案 0 :(得分:1)
- 您需要保持关联
snake_case
- 您不能拥有多个具有相同名称的关联(IE
醇>actions
)
这就是我要做的事情:
#app/models/role.rb
class Role < ActiveRecord::Base
has_many :role_actions
has_many :actions, through: :role_actions do
def status(val)
{ where status: val } # @role.actions.status(1)
end
end
end
#app/models/role_action.rb
class RoleAction < ActiveRecord::Base
belongs_to :role
bleongs_to :action
end
#app/models/action.rb
class Action < ActiveRecord::Base
has_many :role_actions
has_many :actions, through: :role_actions
end
你想在Rails中查找scopes - 在你的关联查询中定义条件是不好的做法,然后才想打破它。有些人称之为antipattern。
-
如果您有“裸”关联,那么您可以根据需要设置范围。您还可以使用ActiveRecord association extensions为您的关联本身提供特定功能(如上所示)。
role.actions("manager")
这可以通过在查找 manager 值时调用Role
对象来实现:
@role = Role.find_by name: "manager"
@role.actions #-> all actions for the "manager" role.