Объявления отношений ActiveRecord для связывания двух записей одной и той же модели? (Самостоятельная ссылка многие ко многим) - PullRequest
1 голос
/ 20 января 2011

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

Используется модель соединения, которая хранит два значения trip_id и значение силы (представляющеесила отношений).

Что делает мою ситуацию сложной, так это то, что эти отношения являются двусторонними отношениями.Таким образом, они не являются "владельцем" отношений.Я хочу взять @trip_a и попросить @ trip_a.trip_relations найти все связанные с ним поездки.И в равной степени я хочу попросить @ trip_b.trip_relations.

Код может помочь объяснить:

class TripRelation < ActiveRecord::Base
  belongs_to :trip_a, :class_name => "Trip", :foreign_key => "trip_a_id"
  belongs_to :trip_b, :class_name => "Trip", :foreign_key => "trip_b_id"
end

class Trip < ActiveRecord::Base
  has_many :trip_a_relations, :class_name => "TripRelation", :foreign_key => "trip_a_id"
  has_many :trip_b_relations, :class_name => "TripRelation", :foreign_key => "trip_b_id"
  has_many :trip_as, :through => :trip_a_relations
  has_many :trip_bs, :through => :trip_b_relations
end

Выше не работает, но, надеюсь, поможет проиллюстрировать намерение.

Я хочу иметь возможность отправиться в любую поездку и попросить @ trip.trip_relations и получить список как @ trip.trip_as, так и @ trip.trip_bs (с удалением дубликатов).

Я также хотел бы совершить любую поездку и установить отношения, такие как @ trip_a.trip_relations << @trip_b.Теперь @ trip_a.trip_relations.include? (@ Trip_b) # => true и @ trip_b.trip_relations.include? (@ Trip_b) # => true.

Я мог бы написать собственные методы, но мне интересно, есть лиспособ сделать это чисто с ActiveRecord.

1 Ответ

1 голос
/ 20 января 2011

Существует библиотека для работы со взаимоотношениями, называемая activ_as_network, которую я использовал в прошлом для отношений, которые похожи на те, к которым, я полагаю, вы стремитесь:

https://github.com/sjlombardo/acts_as_network

...