Как мне создать два отношения к одной и той же модели с разными именами?
У меня есть две модели Rails 4: Journey и Place. Я хотел бы, чтобы Путешествие два имело два поля, начало и пункт назначения, которые оба являются Местами. Мой класс "Путешествие" выглядит так:
class Journey < ActiveRecord::Base
has_one :origin, class_name: :place
has_one :destination, class_name: :place
end
Во-первых, мне также нужно что-то в моем классе Place? Я думал, что мне понадобятся два объявления "has_many", но я не смог понять синтаксис, учитывая две ссылки.
Во-вторых, можно ли ссылаться на место происхождения поездки, используя синтаксис, такой как "j.Origin", где "j" - это запись поездки? (И аналогично для пункта назначения.)
2 ответа
Теоретически эти отношения должны работать на вас:
class Journey < ActiveRecord::Base
belongs_to :origin, class_name: :place
belongs_to :destination, class_name: :place
end
class Place < ActiveRecord::Base
has_many :origin_journeys, foreign_key: origin_id, class_name: :journey
has_many :destination_journeys, foreign_key: destination_id, class_name: :journey
def all_journeys
Journey.where("origin_id = :place_id OR destination_id = :place_id", place_id: self.id)
end
end
Использование:
# controller for exemple
def journeys_of_that_place
@place = Place.find(params[:id])
@journeys = @place.all_journeys
@having_this_place_as_origin = @place.origin_journeys
end
# Question 2: Yes, it is possible
def update_origin
@journey = Journey.find(params[:id])
@journey.origin = Place.find(params[:place_id])
@journey.save
end
Чтобы ответить на ваши вопросы:
Вам ничего не нужно в вашем
Place
класс, если вы не хотите иметь доступJourney
записи изPlace
, Однако вам понадобится внешний ключjourney_id
наplaces
Таблица.Я хотел бы рассмотреть возможность настройки областей
Place
что бы вернутьсяJourney
объекты, которые начинаются или заканчиваются в этом месте, если вы думаете, что они могут вам понадобиться. Проверьте документы наhas_one
а такжеbelongs_to
,Ага. Для этого существует ассоциация. Этот ТАК вопрос может также помочь пролить свет на это.