Да, я тоже не хотел создавать целую кучу таблиц "многие ко многим".Итак, вот как я это делаю (примерно).
Я создал класс с именем 'HasA', который выглядит примерно так:
# == Schema Information
#
# Table name: has_as
#
# id :integer not null, primary key
# haser_type :string not null
# haser_id :integer not null
# hased_type: :string not null
# hased_id: :integer not null
# created_at :datetime not null
# updated_at :datetime not null
#
class HasA < ActiveRecord::Base
validates :haser_type, :haser_id, :hased_type, :hased_id, presence: true
belongs_to :hased, polymorphic: true
belongs_to :haser, polymorphic: true
end
Затем я создал модуль (фактически, коллекциюмодули), которые позволяют мне делать что-то вроде:
class User < ActiveRecord::Base
acts_as_having :groups, :rules
end
И
class Rule < ActiveRecord::Base
acts_as_had_by :groups, :users
end
Так что я могу делать такие вещи, как:
@user.groups
@user.groups << @group
@user.groups.destroy(@group)
@user.group_ids
@user.groups.where(id: 4)
@user.groups.new(id: 5, name: 'foo')
И так далее (по существуРепликация многих стандартных методов, предоставляемых has_many
).
Я также могу сделать:
@rule.groups
@rule.users
Теперь я могу связывать любые модели, которые мне нужны, без необходимости иметь уникальные таблицы связей.Есть только одна таблица HasA
, которая связывает все.И я могу делать все виды операций над связанными записями без необходимости писать какой-либо дополнительный код.Что, я думаю, то, что вы ищете.
Естественно, я собрал все это как драгоценный камень, чтобы я мог включить его во все свои проекты.Потому что, кто хочет кодировать что-то более одного раза?