2011-07-26 20 views
0

我有兩種模型Trip和Day,它們具有一對多的關係。目前我不想讓Day成爲嵌入式文檔。使用mongoMapper在rails 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 

我希望能夠創建一個看起來像這樣的路線:

/trips/:trip_id/days/:index_of_day 

:index_of_day將被用來尋找n天的行程@trip.days[:index_of_day],所以一個人可以輕鬆地瀏覽第一天,第二天等旅行。

目前我route.rb文件看起來像這樣:

resources :trips do 
    resources :days 
end 

產生的缺省路由/trips/:trip_id/days/:day_id

中途的一個解決方案,我已經是擺在我的route.rb文件

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

然後在我的日子控制器

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

這種除了都喜歡trip_day_path自動傭工的工作使用day 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 

你會注意到這是一種hackish,這是一種代碼味道。

+0

謝謝。我被警告不要修改to_param,但我認爲它可能比我目前所做的更清晰。如果我沒有使用:我怎麼知道包括哪些日子? – lashleigh

+0

如果使用許多的w/o:在,那麼這將是一個標準的多對許多: '類日 包括MongoMapper ::文件 鍵:trip_id,OBJECTID belongs_to的:行程 結束 類旅行 包括MongoMapper ::文檔 許多:天 結束# 這將工作。不幸的是,您不能保證所有的日子都會按順序恢復。您可能需要添加另一個密鑰以確保或者聲明您的關聯是這樣的: 'many:days,:order =>:date.asc' –

+0

有趣的是,我沒有意識到它會在沒有創建我自己的day_ids數組,謝謝。 – lashleigh