我希望我的路线类似于car(/:country/):car_id,最好的方法是什么?只有"汽车"会列出所有汽车,"汽车/:国家"会列出该国制造的所有汽车。
现在我有了这样的路线资源:cars,:path=>"cars(/:country)",如果params[:country]为零,我会检查cars#index action,以确定将从数据库中检索到什么。
我的解决方案感觉是错误和丑陋的,我想最好的解决方案和最干净的解决方案是制作一个国家模型,但不知道如何组织起来,提示?country必须有一个slug,car_id也必须有(使用friendly_id作为car_id)。我觉得我应该有一张写着名字和鼻涕虫的汽车表,这就是我所想的。
谢谢!
首先我要说的是,您当前的解决方案既不难看,也不错误,最坏的情况是它很普通。但在没有看到所有涉及的模型和协会的情况下,我只能给出一个大致的答案。
首先,乡村车型,可能是个好主意,但你如何将其与汽车车型联系起来?
你可以这样做:
class Country << ActiveRecord::Base
has_may :cars
end
class Car << ActiveRecord::Base
belongs_to :country
end
这将支持语义,即您可以选择一个国家,并获得属于某个国家的所有汽车,即
@cars = Country.find('USA').cars
或者,你可以做一些类似的事情:
class Car << ActiveRecord::Base
has_one :country
end
class Country << ActiveRecord::Base
end
这将实现一种不同的语义:
@country = Car.find('Jeep').country
重点是考虑您希望在应用程序中具有的查询语义,然后定义您的关联以支持对您的应用程序有意义的语义。我发布了非常简单的关联,你可能会得到多个更复杂的关联,这取决于你需要如何查询数据库和相关的模型。
更新
您发布了:我希望我的路线类似于car(/:country/):car_id,
这没有意义,如果你知道特定的car_id,你就不需要任何过滤或额外的搜索。
听起来你想要这些网址:
/cars # all cars
/cars/:country # all cars in country
/car/:id # a specific car
假设您已经为汽车定义了完整的RESTful路线,即,那么第一条和第三条路线可能就在那里
config/routes.rb
resources :cars
你只需要添加到routes.rb:
GET '/cars/:country' => 'cars#index'
然后在app/controllers/cars_controller.rb:
def index
if params[:country]
@cars = Car.where("country_id = ?", params[:country])
else
@cars = Car.all
end
end
这假设您建立了一个关系,每个汽车记录都有一个country_id属性。这可以通过多种方式实现,例如:
class Car < ActiveRecord::Base
belongs_to :country
end
这意味着我的汽车表有一个country_id属性,我可以做一些类似的事情:
@car=car.fund(1001)
"汽车在#{@car.country.name}">