0

我希望我的路线类似于汽车(/:国家/):car_id,最好的方法是什么?只有“汽车”会列出所有汽车,“汽车/:国家”会列出该国家/地区制造的所有汽车。

现在我有这样的资源:cars,:path => "cars (/:country)" 并且如果 params[:country] 为 nil ,我会检查 cars#index 操作以确定将从数据库中检索到的内容。

我的解决方案感觉错误和丑陋,我想最好和最干净的解决方案是制作一个国家模型,但真的不知道如何组织它,提示?country 必须有 slug,car_id 也必须有(使用friendly_id 作为car_id)。感觉就像我应该有一个带有名字和蛞蝓的汽车桌,这就是我所想出来的。

谢谢!

4

1 回答 1

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

关键是要考虑您希望在您的应用程序中拥有的查询语义,然后定义您的关联以支持对您的应用程序有意义的语义。我发布了非常简单的关联,您最终可能会得到多个更复杂的关联,这取决于您需要如何查询数据库和关联的模型。

更新

您发布:我希望我的路线类似于汽车(/:国家/):car_id,

这没有任何意义,如果您知道具体的 car_id,则不需要任何过滤或额外搜索。

听起来你想要这些 URL:

/cars          # all cars
/cars/:country # all cars in country
/car/:id       # a specific car

假设您已经为汽车定义了全套 RESTful 路线,那么第一条和第三条路线可能就在那里,即

配置/路由.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}”

于 2012-09-18T17:46:29.677 回答