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_id通过 URL 传入的来过滤它。不过,这里还有一些其他问题:首先,这种逻辑实际上不应该出现在视图中,而可能出现在您的模型中;更严重的是,默认情况下,rails 需要使用:idurl 中的位置,而不是名称/缩写,所以你需要路由/location/1/categories而不是/locations/ny/categories(尽管有一些 gem 可以让你绕过这个要求)。

于 2013-04-19T06:47:43.183 回答
1

当您有独特的要求时,我认为您不应该使用嵌套资源进行路由。我会像这样设置路由

get locations/:state/categories => "categories#index"
get locations/categories => "categories#index"

在里面categories#index我会if params[:state].nil?根据这个检查你可以决定是否在你的检索查询中按状态过滤,并且视图将保持不变

于 2013-04-19T06:20:28.413 回答