如何使用不同的名称为同一模型创建两个关系?

时间:2013-11-12 20:27:09

标签: ruby-on-rails ruby ruby-on-rails-4 rails-models

我有两个Rails 4型号:Journey and 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 个答案:

答案 0 :(得分: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 :(得分:1)

回答你的问题:

  1. 除非您希望能够从Place访问Journey条记录,否则Place课程中不需要任何内容​​。但是,您需要journey_id表上的外键places

    如果您认为可能需要,我会考虑在Place上设置范围,这些范围会返回在该地方开始或结束的Journey个对象。查看has_onebelongs_to上的docs

  2. 是的。这就是协会的用途。 This SO question也可能有助于阐明它。