вызов ассоциации интересных рельсов - PullRequest
1 голос
/ 01 июля 2010

Я наткнулся на интересную проблему, связанную с активными ассоциациями записей:

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

Поэтому я не уверен, как лучше связать их.

Ответы [ 4 ]

1 голос
/ 01 июля 2010

Я беру пример Элимантаса, исправил некоторые логические ошибки.в основном, у вас есть учетная запись с 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
1 голос
/ 01 июля 2010

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

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 голосов
/ 01 июля 2010

так что я думаю, что нашел лучшее решение для этого, которое заключается в использовании Multi Table Inheritance, для всех, кто заинтересован, вот ссылка http://mediumexposure.com/multiple-table-inheritance-active-record/

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