Я беру пример Элимантаса, исправил некоторые логические ошибки.в основном, у вас есть учетная запись с N организациями (которая является полиморфной моделью и имеет отношение к одной из компаний, подрядчиков и т. д.)
class Account < ActiveRecord::Base
has_many :organizations
end
class Organization < ActiveRecord::Base
belongs_to :account
belongs_to :resource, :polymorphic => true
end
class Company < ActiveRecord::Base
has_many :organizations, :as => :resource
end
class Contractor < ActiveRecord::Base
has_many :organizations, :as => :resource
end
[...etc...]
РЕДАКТИРОВАТЬ: вот тот же подход к управлению ролями:
# just edited Account model with role.
class Account < ActiveRecord::Base
has_many :organizations
has_one :role
end
class Role < ActiveRecord::Base
belongs_to :account
belongs_to :resource, :polymorphic => true
end
class Accountant < ActiveRecord::Base
has_one :role, :as => :resource
end
class Owner < ActiveRecord::Base
has_one :role, :as => :resource
end
РЕДАКТИРОВАТЬ 2:
редактирование тринадцатое, теперь отношение: Учетная запись has_many Организации, каждая организация имеет_ одну роль, Учетная запись has_many Роли через организации
class Account < ActiveRecord::Base
has_many :organizations
has_many :roles, :through => :organizations
end
class Role < ActiveRecord::Base
belongs_to :resource, :polymorphic => true
end
class Accountant < ActiveRecord::Base
has_one :role, :as => :resource
end
class Owner < ActiveRecord::Base
has_one :role, :as => :resource
end
верно?
РЕДАКТИРОВАТЬ3: Роль как модель без AR:
Это может зависеть от того, сколько ролей вы планируете иметь, или у вас может быть поле name: string, где укажите «Бухгалтер», «Owner 'и т. Д.
если вы не планируете использовать Role в качестве модели AR, вы можете определить целочисленный столбец под названием' role_id 'и использовать стоимостный элемент с хешем в модели организации:
class Organization < ActiveRecord::Base
belongs_to :account
ROLES={'Accountant' => 1, 'Owner' => 2 }
# get role as literal name
def role
ROLES.invert[role_id]
end
end
таким образом у вас будет учетная запись со многими организациями, каждая из которых имеет определенную роль в отношении этой конкретной учетной записи.
EDIT4: пример кода EDIT3, следующий код является сырье пример того, как может выглядеть эта ассоциация:
# new account
a = Account.new(....)
# new company & organization with a role
comp = Company.create(....)
org1 = Organization.new(:role_id => 1, ....)
org1.resource = comp
# new Contractor & Organization with another role
contr = Contractor.create(....)
org2 = Organization.new(:role_id => 2, ....)
org2.resource = contr
a.organizations << org1
a.organizations << org2
# save Account, it will have 2 different organizations, each one with a specific role
a.save