Как мне создать два отношения к одной и той же модели с разными именами?

У меня есть две модели 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

Чтобы ответить на ваши вопросы:

  1. Вам ничего не нужно в вашем Place класс, если вы не хотите иметь доступ Journey записи из Place, Однако вам понадобится внешний ключ journey_id на places Таблица.

    Я хотел бы рассмотреть возможность настройки областей Place что бы вернуться Journey объекты, которые начинаются или заканчиваются в этом месте, если вы думаете, что они могут вам понадобиться. Проверьте документы на has_one а также belongs_to,

  2. Ага. Для этого существует ассоциация. Этот ТАК вопрос может также помочь пролить свет на это.

Другие вопросы по тегам