【发布时间】:2011-10-31 21:57:16
【问题描述】:
我在应用程序中命名空间代码作为练习。我所说的“锻炼”,完全是为了好玩。假设示例角色 Performer 和 Manager 代表 20 个必须与辅助方法一起定义的角色中的 2 个。
class Role
module Performer
extend ActiveSupport::Concern
module InstanceMethods
def performer?(id = @current_user_id)
true unless self.roles.where(user_id: id, name: 'Performer').empty?
end
def make_performer(id = @current_user_id)
self.roles.new(user_id: id, name: 'Performer')
end
end
end
module Manager
extend ActiveSupport::Concern
module InstanceMethods
def manager?(id = @current_user_id)
true unless self.roles.where(user_id: id, name: 'Manager').empty?
end
def make_manager(id = @current_user_id)
self.roles.new(user_id: id, name: 'Manager')
end
end
end
end
选择角色会根据需要混合到其他模块中。每个模块都混合了一组不同的角色,
class Group
module Roles
extend ActiveSupport::Concern
included do
include Role::Manager
include Role::Performer
before_create :make_creator_manager
protected
def make_creator_manager
make_manager @current_user_id if @current_user_id
end
end
end
end
然后通过多态关联与单个模型相关联。
class Group < ActiveRecord::Base
include Group::Roles
attr_accessor :current_user_id
has_many :roles, as: :restrictable
end
我可以用闭包来干掉方法的内容,但是由于方法的名称也遵循一个模式,metaprogramming 会更有意义吗? ruby example
元编程在 ruby 中是否足够普遍,以至于无论谁(理论上)接管这个项目都能够毫无困难地维护它?
编辑 1:角色迁移可能与本次讨论相关
class CreateRoles < ActiveRecord::Migration
def change
create_table :roles do |t|
t.belongs_to :user
t.references :restrictable, polymorphic: true
t.string :name
t.timestamps
end
add_index :roles, :user_id
add_index :roles, [:restrictable_id, :restrictable_type]
end
end
【问题讨论】:
标签: ruby-on-rails ruby metaprogramming maintenance