Цепочка владения Rails и STI

Учитывая следующие таблицы:

users
organizations
accounts
  owner_id
  owner_type
profiles

Если учетные записи могут принадлежать либо пользователю, либо организации, и каждая учетная запись имеет ровно один профиль, возможно ли выполнить STI в Rails в профиле без необходимости поля «тип»? IE, могу ли я иметь классы OrganizationProfile и UserProfile, которые загружаются на основе цепочки владения, или мне нужно иметь избыточное поле «тип» в профиле?


person kid_drew    schedule 05.09.2013    source источник


Ответы (2)


Это не ответ, так как он не проверен, но я хотел попробовать, и мне нужно было форматирование.

Для вашего кода мне имеет больше смысла иметь две области в Profile:

belongs_to :account
scope :user, joins(:account).where(account: {owner_type: :User} )
scope :organization, joins(:account).where(account: {owner_type: :Organization} )

Если вы все равно хотите, чтобы эти другие классы вы могли сделать:

class UserProfile
  self.table_name = 'profiles'
  default_scope joins(:account).where(account: {owner_type: :User} )

и так далее с профилем организации.

Если соединения не работают, попробуйте:

joins(:account).where('accounts.owner_type = User')

or

joins(:account).where(accounts: {owner_type: :User} )

Я не уверен, что ActiveRecord получает туда хэш.

person sites    schedule 05.09.2013
comment
Интересно... Я не знал о ключевом слове scope. - person kid_drew; 06.09.2013

В STI все записи существуют в одной таблице, которая наследуется от «родительского» класса, в вашем случае Profile.

Rails использует поле type для определения типа класса при десериализации, так что на самом деле нет способа обойти его в таблице profiles.

person Caleb Hearth    schedule 05.09.2013