2010-07-01 4 views
1

я наткнулся на интересную задачу в отношении активных записей ассоциаций:интересные рельсы ассоциации вызов

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

Так что я не уверен, что лучший способ связать их.

ответ

1

Я беру пример 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 
+0

так где же эта роль вписывается в это? – Cezar

+0

Организация - это полиморфная модель, связанная с Компанией, Подрядчиком и т. Д.то вы можете повторно применить тот же подход к роли, который связан с бухгалтером, владельцем и т. д. ... –

+0

Хм ... роль прилив как для учетной записи, так и для организации. Например, учетная запись является бухгалтером для организации1, а учетная запись является владельцем организации2. Не знаете, как это соответствует вашему описанию. – Cezar

1

Используйте полиморфную ассоциацию для присоединения различных типов организаций. Что-то вроде

class Account < ActiveRecord::Base 
    has_many :organizations 
end 

class Organization < ActiveRecord::Base 
    belongs_to :account 
    has_many :organizations 
end 

class Company < ActiveRecord::Base 
    belongs_to :organization, :polymorphic => true 
end 

class Contractor < ActiveRecord::Base 
    belongs_to :organization, :polymorphic => true 
end 

class Person < ActiveRecord::Base 
    belongs_to :organization, :polymorphic => true 
end 

Сверху моей головы. Может потребоваться некоторые настройки. Что касается вашей роли - добавьте role_id или строку ролей к модели Organization.

+0

Организация has_many: организации? – Cezar

Смежные вопросы