В моих проектах я использую класс Relationship
(в драгоценности, которую я назвал ActsAsRelatingTo
) в качестве модели объединения. Это выглядит примерно так:
# == Schema Information
#
# Table name: acts_as_relating_to_relationships
#
# id :integer not null, primary key
# owner_id :integer
# owner_type :string
# in_relation_to_id :integer
# in_relation_to_type :string
# created_at :datetime not null
# updated_at :datetime not null
#
module ActsAsRelatingTo
class Relationship < ActiveRecord::Base
validates :owner_id, presence: true
validates :owner_type, presence: true
validates :in_relation_to_id, presence: true
validates :in_relation_to_type, presence: true
belongs_to :owner, polymorphic: true
belongs_to :in_relation_to, polymorphic: true
end
end
Таким образом, в вашей User
модели, вы могли бы сказать что-то вроде:
class User < ActiveRecord::Base
has_many :owned_relationships,
as: :owner,
class_name: "ActsAsRelatingTo::Relationship",
dependent: :destroy
has_many :organizations_i_relate_to,
through: :owned_relationships,
source: :in_relation_to,
source_type: "Organization"
...
end
Я считаю, что вы можете быть в состоянии оставить source_type
аргумент от момента вступил класса (Organization
) можно сделать из :organizations
. Часто я присоединяюсь к моделям, где имя класса не может быть выведено из имени отношения, и в этом случае я включаю аргумент source_type
.
С этим можно сказать user.organizations_i_relate_to
. Вы можете сделать то же самое для отношений между любым набором классов.
Вы также мог бы сказать в своем классе Organization
:
class Organization < ActiveRecord::Base
has_many :referencing_relationships,
as: :in_relation_to,
class_name: "ActsAsRelatingTo::Relationship",
dependent: :destroy
has_many :users_that_relate_to_me,
through: :referencing_relationships,
source: :owner,
source_type: "User"
Так что можно сказать, что organization.users_that_relate_to_me
.
Я устал от того, чтобы сделать все настройки, так что в моей жемчужине я создал acts_as_relating_to
метод, так что я могу сделать что-то вроде:
class User < ActiveRecord::Base
acts_as_relating_to :organizations, :teams
...
end
и
class Organization < ActiveRecord::Base
acts_as_relating_to :users, :organizations
...
end
и
class Team < ActiveRecord::Base
acts_as_relating_to :organizations, :users
...
end
и все полиморфные ассоциации и методы устанавливаются для меня «автоматически».
Извините за длинный ответ. Надеюсь, вы найдете в нем что-то полезное.