Я беру пример Elimantas', исправлены некоторые логические ошибки. в принципе, у вас есть учетная запись с 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...]
EDIT: здесь тот же самый подход к управлению ролями:
# 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
EDIT2:
thirth редактировать, теперь отношение: счета has_many организации, каждая организация has_one Роль, счет 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
Это право?
EDIT3: Роль как не AR модели:
Это может зависеть от того, сколько ролей вы планируете иметь, или вы можете иметь название: строковое поле, где указать «бухгалтер», «Владелец», и так далее ,
, если вы не планируете ставить роль как 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
так где же эта роль вписывается в это? – Cezar
Организация - это полиморфная модель, связанная с Компанией, Подрядчиком и т. Д.то вы можете повторно применить тот же подход к роли, который связан с бухгалтером, владельцем и т. д. ... –
Хм ... роль прилив как для учетной записи, так и для организации. Например, учетная запись является бухгалтером для организации1, а учетная запись является владельцем организации2. Не знаете, как это соответствует вашему описанию. – Cezar