Условное наследование классов для модели рельсов - PullRequest
3 голосов
/ 23 декабря 2011

У меня есть приложение для мультитенантных рельсов. Модели, которые я хочу использовать для текущего арендатора (например, модель этой статьи здесь) наследуют модель арендатора, как эта

class Article < TenantScoped

end

это прекрасно работает. я получаю только объекты, выделенные для текущего арендатора.

но сейчас я создаю интерфейс администратора, где я хочу иметь возможность добавлять статьи всем арендаторам. но мой интерфейс администратора выступает в роли арендатора, и модели подпадают под него. Который заканчивается без записей.

Я полагаю, что наилучшее решение для этого - условно наследовать от модели области действия арендатора, как это

class Article

  unless SudoTenant.current?
    < TenantScoped
  else
    < ActiveRecord::Base
  end

end

Я искал условное наследование классов ruby ​​и еще ничего не нашел. мой синтаксис здесь неправильный или это вообще возможно?

Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 23 декабря 2011

Не совсем то, о чем вы спрашиваете, но я получаю то же самое (глобальные статьи о приложении-арендаторе), и я только что создал Tenant for Admin для использования его в моих глобальных статьях. .

У меня есть что-то вроде этого:

#article.rb
def self.global
  unscoped.where(:company => Company.admin)
end


#company.rb
def self.admin
  where(:name => 'admin').first # this can pretty much be anything that fits to you.
end
0 голосов
/ 23 декабря 2011

Вы можете определить класс, используя синтаксис блока:

if SudoTenant.current?
  Article = Class.new(ActiveRecord::Base) do
    # your code
  end
else
  Article = Class.new(TenantScoped) do
    # your code
  end
end

Я настоятельно рекомендую использовать миксины вместо условного наследования, это чище, яснее и понятнее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...