Как бы вы рубиново-за этого не-AR модели для Ruby на приложения Rails?


Это урок из моего приложения Rails. Он используется в качестве не модели базы данных в моем приложении RoR и использует синтаксис, похожий на АР шаблон дизайна. Интересно, есть ли способ, чтобы сделать это более похожим код Ruby?

class Role

  def self.all
    role_list = Array.new

    r1 = Role.new
    r1.id = 1
    r1.symbol = :owner
    r1.name = "Owner"
    r1.has_all_permissions = true
    role_list << r1

    r2 = Role.new
    r2.id = 2
    r2.symbol = :admin
    r2.name = "Administrator"
    r2.has_all_permissions = false
    role_list << r2

    r3 = Role.new
    r3.id = 3
    r3.symbol = :gamemaster
    r3.name = "Gamemaster"
    r3.has_all_permissions = false
    role_list << r3

    role_list
  end

  def self.find(id)
    roles = Role.all

    roles.each do |role|
      if role.id == id
        return role
      end
    end

    nil
  end

  def self.find_by_symbol(symbol)
    roles = Role.all

    roles.each do |role|
      if role.symbol == symbol
        return role
      end
    end

    nil
  end

  def assign_permission(symbol)
    permission = Permission.find_by_symbol(symbol)

    if permission == nil
      return nil
    end

    permission_roles = PermissionRole.where(:permission_id => permission.id, :role_id => self.id)

    if permission_roles.size == 0
      permission_role = PermissionRole.new
      permission_role.permission_id = permission.id
      permission_role.role_id = self.id
      return permission_role.save
    end

    true
  end

  def has_permission?(symbol)
    permission = Permission.find_by_symbol(symbol)

    if permission == nil
      raise StandardError, "Permission does not exist"
    end

    permission_roles = PermissionRole.where(:permission_id => permission.id, :role_id => self.id)

    if permission_roles.size > 0
      return true
    else
      return false
    end
  end

  attr_accessor :id
  attr_accessor :symbol
  attr_accessor :name
  attr_accessor :has_all_permissions

end


288
3
задан 7 августа 2011 в 06:08 Источник Поделиться
Комментарии
1 ответ

Для затравки:

def initialize(attributes = {})
attributes.each do |attr, value|
self.send "#{attr}=", value
end
end

Позволит вам получить свою очередь:

r1 = Role.new
r1.id = 1
r1.symbol = :owner
r1.name = "Owner"
r1.has_all_permissions = true
role_list << r1

в:

role_list << Role.new {:id => 1,
:symbol => :owner,
:name => "Owner",
:has_all_permissions => true}

которая гораздо больше и ActiveRecord-как.


Хранение roles_list в глобальной переменной может быть приемлемо для вашего приложения, а также позволит вам иметь:

def self.create(attributes = {})
$roles_list << Role.new(attributes)
end

и:

def self.all
return $roles_list if $roles_list

# rest of code to init $roles_list with default roles
end

для дальнейшего ActriveRecord-Несс


Затем:

def self.find(id)
roles = Role.all

roles.each do |role|
if role.id == id
return role
end
end

nil
end

может быть переписан так:

def self.find(id)
Role.all.find{|r| r.id == id}
end

Это потому, что массив имеет свою #найти способ. Тот же рефакторинг может быть применена для самостоятельного.find_by_symbol.


Как заключительная записка, Я бы переместить attr_accessor линии к вершине.

Надеюсь, что помогла :-)

3
ответ дан 29 августа 2011 в 09:08 Источник Поделиться