1

ユーザーが質問をして専門家に回答してもらうRailsアプリがあります。質問と回答のモデルに加えて、アプリは次の方法でカテゴリを追跡します

Question.rb

 has_many :categorizations
 has_many :categories, through: :categorizations

カテゴリー.rb

  has_many :categorizations
  has_many :questions, through: :categorizations

分類.rb

 belongs_to :question
 belongs_to :category

今、私は localhost:3000/categories にアクセスして、質問のあるすべてのカテゴリのリストを確認できます。ただし、カテゴリは重要ですが、質問の性質上、カリフォルニア州の誰かがニューヨークについての質問に答えられる可能性は低いため、あまり実用的ではありません。したがって、場所によっても質問をフィルタリングしたいと思います。URLを設定する最良の方法は次のようになると思います

localhost:3000/state/ny/categories

ネストされたルートを作成することでできることを理解しています (たとえば、場所のリソースを作成した場合)

resources :states do
    resources :categories 
end 

そのため、もともと場所を質問モデルのフィールドとして保存していましたが、現在は場所モデルを作成しました (「状態」が予約語である場合は、よくわかりませんでした)。やった

Location.rb

has_many :questions

Question.rb

belongs_to :locations

また、ネストされたルーティングも行ったので、州ごとにカテゴリをフィルタリングできました

  resources :locations do
        resources :categories 
  end 

ただし、場所とカテゴリの間の関連付けを作成していないことに気付くでしょう。したがって、このルートに移動すると

http://localhost:3000/locations/ny/categories

index.html.erb ビュー ページに、各カテゴリにいくつの質問があるかが表示されている場合

<% @categories.each do |category| %>
  <div class="category">
    <h5><%= link_to category.name, category %></h5>
    <%= pluralize category.questions.size, "question" %>
  </div>
<% end %>

場所によってフィルタリングされていません。たとえば、場所に関係なくすべての質問をカウントします。場所をフィルタリングするロジックをビューに追加しない限り、このようなルートを使用してもメリットはありません。

カテゴリの代わりに、質問を入れ子にしてみましたが、明らかに何も変わりません。

  resources :locations do
        resources :questions
  end 

私がやろうとしていることを見ることができると思います。どうすればいいのか教えてください。

たとえば、場所とカテゴリの間の関連付けを作成する必要がありますか? もしそうなら、私が持っているその結合モデルでどのように機能しますか? または、場所ごとにカテゴリにリストされている質問または質問をフィルタリングする方法を教えてください。

いくつかのポインタを提供できれば感謝します。

4

2 に答える 2

1

ネストされたルートが配置されている場合、フィルタリングは自動的には行われません。手動で行う必要があります。ネストされたルートは、物事を管理しやすくし、ユーザーのエクスペリエンスを向上させるためのものであり、面倒な作業を行うためのものではありません。したがって、あなたの場合、ビューでは、カウントを取得するためのコードを次のように変更する必要があります。

category.questions.where(location_id: params[:location_id]).size

:location_idURL を介して渡されたものを使用してフィルタリングしている場所。ただし、ここには他にもいくつかの問題があります。1 つは、そのようなロジックは実際にはビューではなく、モデルにある可能性があります。さらに深刻なことに、デフォルトでは、レールは:id名前/略語ではなく、URL の場所を使用する必要があるため、ルートを使用する必要があります/location/1/categories(/locations/ny/categoriesただし、この要件を回避できる宝石があります)。

于 2013-04-19T06:47:43.183 に答える