0

ルートを cars(/:country/):car_id のようにしたいのですが、これを行う最善の方法は何ですか? 「cars」のみがすべての車をリストし、「cars /: country」はその国で製造されたすべての車をリストします。

今、私はこのリソースのようなルートを持っています: cars,: path => "cars (/:country)" そして、データベースから何を取得するかを決定するために、params[:country] が nil の場合、cars#index アクションをチェックインします。

私の解決策は間違っていて醜く感じます。最善の解決策と最もクリーンな解決策は、国のモデルを作成することだと思いますが、すべてを整理する方法が本当にわかりませんか? country にはスラッグが必要で、car_id も同様です (car_id に Friendly_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

重要なのは、アプリに必要なクエリ セマンティクスを考えてから、アプリにとって意味のあるセマンティクスをサポートする関連付けを定義することです。私は非常に単純な関連付けを投稿しました。データベースと関連付けられたモデルをどのように照会する必要があるかによって、複数のより複雑な関連付けになる可能性があります。

アップデート

あなたが投稿した: ルートを cars(/:country/):car_id, のようなものにしたい

特定の car_id を知っていれば、フィルタリングや追加の検索は必要ありません。

次の URL が必要なようです。

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

1 番目と 3 番目のルートは、自動車用の 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

つまり、私の car テーブルには country_id 属性があり、次のようなことができます。

@car = Car.find(1001)

「車は #{@car.country.name} にあります」

于 2012-09-18T17:46:29.677 に答える