我有两个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”是旅程记录? (同样的目的地。)
答案 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)
回答你的问题:
除非您希望能够从Place
访问Journey
条记录,否则Place
课程中不需要任何内容。但是,您需要journey_id
表上的外键places
。
如果您认为可能需要,我会考虑在Place
上设置范围,这些范围会返回在该地方开始或结束的Journey
个对象。查看has_one
和belongs_to
上的docs。
是的。这就是协会的用途。 This SO question也可能有助于阐明它。