我希望我的路线像汽车(/:country /):car_id,最好的方法是什么?只有“汽车”会列出所有汽车,“汽车/:国家”将列出在该国家制造的所有汽车。
现在我的路线就像这样的资源:cars,:path => “汽车(/:国家)”和我检查汽车#index action如果params [:country]为零,以确定将从数据库中检索什么。
我的解决方案感觉错误和丑陋,我认为最好的解决方案和最干净的方法是建立一个国家模型,但是真的不知道如何整理它,提示? country必须有一个slug,car_id也是如此(使用friendly_id作为car_id)。感觉就像我应该有一张带有名字和slug的汽车桌子,这些都是我想到的。
谢谢!
答案 0 :(得分:2)
首先,我要说你现在的解决方案并不丑陋,也不错,最糟糕的是它是行人。但是,如果没有看到所有涉及的模型和关联,我只能给出一般答案。
首先,一个国家模型,可能是一个好主意,但你如何将它与汽车模型联系起来?
你可以这样做:
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
关键是要考虑您希望在应用中使用的查询语义,然后定义关联以支持对您的应用有意义的语义。我发布了非常简单的关联,您最终可能会有多个更复杂的关联,这取决于您需要如何查询数据库和相关模型。
更新
你发布了: 我希望我的路线像汽车(/:country /):car_id,这没有意义,如果您知道具体的car_id,则不需要任何过滤或额外搜索。
听起来像你想要这些网址:
/cars # all cars
/cars/:country # all cars in country
/car/:id # a specific car
第一条和第三条路线可能就是假设你已经为汽车定义了全套RESTful路线,即
配置/ 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.find(1001)
“这辆车在#{@ car.country.name}”