【问题标题】:Rails + simple role system through associative tableRails + 通过关联表的简单角色系统
【发布时间】:2011-02-06 16:21:17
【问题描述】:

所以我有 Ninja 模型,它通过 ninja_hovercrafts(存储 ninja_id 和 hovercraft_id)有许多 Hovercrafts。

据我了解,这种排列方式应该设置为关联表只存储足够的信息来绑定两个不同的类。

但我想在我的应用程序中使用关联表作为一个非常简化的授权中心。因此,如果此绑定使忍者成为给定气垫船的飞行员或副驾驶,我还希望此表通过表中的“角色”字段通知我的系统。

我的问题是:

  1. 这丑吗?

  2. 这正常吗?

  3. rails 中是否有内置方法可以帮助我自动创建与角色的 Ninjas 和 Hovercrafts 关联?例如,我是否可以有一个嵌套表单来创建 ninjas 和 hcs 以同时填充 ninjas_hovercrafts 中的角色字段?

  4. 如果以这种方式管理我的应用程序角色不是一个好主意,那么非资源密集型替代方案是什么(我的应用程序在设计时试图避免可伸缩性问题,例如过度连接、包含等)

谢谢

【问题讨论】:

  • 也许这是一种没有正确或错误答案的问题。人们害怕在面临被降级的风险时浪费时间详细阐述的问题......来吧伙计们! :)

标签: ruby-on-rails activerecord authorization roles has-and-belongs-to-many


【解决方案1】:

这可能无法完全回答您的问题,但如果您只想为气垫船担任两个角色,我会改为设置这样的关联

class Hovercraft < ActiveRecord::Base
  belongs_to :pilot, :class_name => 'Ninja', :foreign_key => 'pilot_id'
  belongs_to :copilot, :class_name => 'Ninja', :foreign_key => 'copilot_id'
end

class Ninja < ActiveRecord::Base
  has_many :pilotings, :class_name => 'Hovercraft', :foreign_key => 'pilot_id'
  has_many :copilotings, :class_name => 'Hovercraft', :foreign_key => 'copilot_id'
end

现在,如果您有更多的角色,或者如果您需要更大的灵活性,您可以使用第三种模型将它们联系在一起。

class Hovercraft < ActiveRecord::Base
  has_many :hovercraft_roles
  has_many :ninjas, :through => :hovercraft_roles
end

class HovercraftRole < ActiveRecord::Base
  belongs_to :hovercraft
  belongs_to :ninja
end

class Ninja < ActiveRecord::Base
  has_many :hovercraft_roles
  has_many :hovercrafts, :through => :hovercraft_roles
end

HovercraftRole 模型中使用角色属性来指示它是“飞行员”还是“副驾驶”。

【讨论】:

    猜你喜欢
    • 2013-11-24
    • 2016-03-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-24
    • 2013-05-19
    • 2016-01-01
    • 2012-06-07
    • 1970-01-01
    相关资源
    最近更新 更多