2011-07-26 8 views
0

1対多の関係を持つ2つのモデルTripとDayがあります。当分の間、私はDayを埋め込み文書にしたくありません。mongoMapperを使用したレール3の配列のインデックスに基づくルーティング

class Day 
    include MongoMapper::Document 
    ... 
    key :trip_id, ObjectId 
    belongs_to :trip 
end 

class Trip 
    include MongoMapper::Document 
    ... 
    key :day_ids, Array 
    many :days, :in => :day_ids 
end 

私はこのようにルートを作成できるようにしたいと思います:

:index_of_dayが旅行 @trip.days[:index_of_day]のn番目の日を見つけるために使用されますので、人は簡単にナビゲートすることができ
/trips/:trip_id/days/:index_of_day 

旅行の第1、第2などの日。デフォルトルート/trips/:trip_id/days/:day_idを生成

resources :trips do 
    resources :days 
end 

現在、私のroute.rbファイルには、次のようになります。私が持っていた

一つ途中ソリューションは、コントローラ

def show 
    @day = Trip.find(params[:trip_id]).days(params[:id].to_i) 
    ... 
end 

自動的trip_day_pathのようなヘルパーのすべてを除いて働いていたこの種の私の日、私のroute.rbファイルに入れて

match 'trips/:trip_id/day/:id' => 'days#show' 

そしてでした日のインデックスではなく、日のIDを使用してリダイレクトします。

答えて

2

援助者に日IDの代わりにインデックスを使用させる場合は、Dayモデルでto_paramを定義できます。 Railsはオブジェクトにto_paramを呼び出し、URLに何を入れるべきかを調べます。

class Day 
    # ... 

    # many :in is for many-to-many, but you are using it for one-to-many 
    # either way, many :in doesn't have an inverse yet 
    def trip 
    Trip.first('day_ids' => self.id) 
    end 

    def to_param 
    trip.days.find_index(self) 
    end 
end 

これはコードの匂いであることがわかります。

+0

ありがとうございました。 to_paramの変更を警告しましたが、私が現在行っていることよりもきれいな解決策になると思います。私が使用しなかった場合:どの日が含まれていたかをどのように知ることができますか? – lashleigh

+0

あなたはW/Oの多くを使用する場合:それは、多対多の標準になるだろう、中:trip_id、ObjectIdが belongs_toの:トリップ エンド クラス 'クラスの日 MongoMapper ::ドキュメントキー が含まれます日だけで動作します end' :トリップ はMongoMapper ::ドキュメント 多くが含まれています。残念ながら、あなたのすべての日が順番に戻ってくることは保証されません。 '多く:日、:あなたはそれを確実にするために別のキーを追加したり、このような関連性宣言する必要がある場合があります順序を=>:date.asc' –

+0

興味深い、私はそれだけで作成せずに動作することを認識していませんでしたday_ids私自身の配列、ありがとう。 – lashleigh

関連する問題