1

Journey と Place という 2 つの Rails 4 モデルがあります。ジャーニー 2 には、出発地と目的地の 2 つのフィールドがあり、どちらも場所です。私の Journey クラスは次のようになります。

class Journey < ActiveRecord::Base
  has_one :origin, class_name: :place
  has_one :destination, class_name: :place
end

まず、私の Place クラスにも何か必要ですか? 2 つの「has_many」宣言が必要だと思っていましたが、2 つの参照が与えられた構文を理解できませんでした。

第二に、「j.Origin」のような構文を使用してジャーニーの起点場所を参照することは可能でしょうか? ここで、「j」はジャーニー レコードです。(宛先も同様です。)

4

2 に答える 2

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
于 2013-11-12T20:57:16.407 に答える
1

質問に答えるには:

  1. からレコードPlaceにアクセスできるようにしたい場合を除き、クラスには何も必要ありません。ただし、テーブルには外部キーが必要です。JourneyPlacejourney_idplaces

    Placeスコープが必要な場合は、その場所で開始または終了したオブジェクトを返すスコープを設定することを検討しJourneyます。およびのドキュメントを確認してください。has_onebelongs_to

  2. うん。そのためにあるのが協会です。 このSOの質問も、それに光を当てるのに役立つ場合があります。

于 2013-11-12T20:56:29.130 に答える