Rails: Rolga asoslangan modulni o'z ichiga oladi

Mening ilovamda ikkita types foydalanuvchi (sportchilar va foydalanuvchilar) mavjud. Athlete User sinfini meros qilib oladi, chunki u STI sozlamalaridan foydalanadi. Boshqa turdagi foydalanuvchilar ham bor, lekin bu turdagi foydalanuvchilar o'zlarining rollariga qarab o'rnatiladi.

Misollar:

Murabbiy --> Regular User with the role of 'Coach'
Maktab administratori --> Regular User with the role of 'School Admin'
Ishtirokchi --> Regular User with the role of Contributor

Ilovamda saqlanib qolgan eski kod foydalanuvchi turi (class Coach < User;) sifatida Coach ga ega edi, lekin mening ilovamda Murabbiyning yagona foydalanuvchi turi sifatida oldinga siljishi unchalik mantiqiy emas. Men Coach modelidagi usullardan foydalanmoqchiman va ularni modulga ko'chirmoqchiman, lekin agar foydalanuvchi murabbiy roliga ega bo'lsa, modulni kiritish usuli bormi yoki yo'qligini bilmoqchi edim?


person dennismonsewicz    schedule 01.11.2013    source manba


Javoblar (1)


Ha, bu mumkin. Buni qilishning bir usuli bo'ladi:

class User < ActiveRecord::Base
  ...
  after_initialize :extend_with_role_module

  private

  def extend_with_role_module
    case role
    when 'coach'
      self.extend CoachModule
    when 'school_admin'
      self.extend SchoolAdminModule
    when 'contributor'
      self.extend Contributor
    end
  end
  ...
end

Lekin bu dahshatli dizayn, chunki after_initialize bloki xotiraga yuklangan barcha User misollar uchun chaqiriladi. Kod, ehtimol, refaktoring uchundir.

Manba: Ruby 2.0.0 Docs - Object#extend a>

person theodorton    schedule 01.11.2013