Rails嵌套资源ID相对于父级不是

时间:2017-07-15 20:21:10

标签: ruby-on-rails database activerecord ruby-on-rails-5

我有一个小型的Rails 5应用程序,它有电路板,每个电路板都有帖子(有点像Reddit)。

董事会模式:

class Board < ApplicationRecord
  has_many :posts
end

发布模型:

class Post < ApplicationRecord
  belongs_to :board
  validates :title, presence: true, length: { minimum: 1, maximum: 64}
  mount_uploader :image, ImageUploader
end

我已将帖子资源嵌套在棋盘资源下。

routes.rb中:

Rails.application.routes.draw do
  resources :boards, param: :name, path: '/' do
    resources :posts, path: '/', except: [:index]
  end
end

rails routes:

         Prefix Verb   URI Pattern                     Controller#Action
    board_posts POST   /:board_name(.:format)          posts#create
 new_board_post GET    /:board_name/new(.:format)      posts#new
edit_board_post GET    /:board_name/:id/edit(.:format) posts#edit
     board_post GET    /:board_name/:id(.:format)      posts#show
                PATCH  /:board_name/:id(.:format)      posts#update
                PUT    /:board_name/:id(.:format)      posts#update
                DELETE /:board_name/:id(.:format)      posts#destroy
         boards GET    /                               boards#index
                POST   /                               boards#create
      new_board GET    /new(.:format)                  boards#new
     edit_board GET    /:name/edit(.:format)           boards#edit
          board GET    /:name(.:format)                boards#show
                PATCH  /:name(.:format)                boards#update
                PUT    /:name(.:format)                boards#update
                DELETE /:name(.:format)                boards#destroy

我遇到的问题是帖子ID在全球范围内递增,而不是相对于它发布的电路板。一个例子:

我们说我有两个空板:一个新闻&#39;董事会和政治&#39;板。我为新闻板创建一个帖子并获取路线: http://localhost:3000/news/1。太好了,这就是我的期望。它在电路板上排名第一,因此帖子ID应为1.现在我的问题是,如果我向另一个电路板发帖,帖子会获得ID 2,如:http://localhost:3000/politics/2。我希望它是http://localhost:3000/politics/1,因为它是相对于该董事会的第一篇帖子。

我如何实现这一点,以便ID相对于父板?

1 个答案:

答案 0 :(得分:0)

我的提示:不要这样做,这很容易出错。

但如果你真的需要这个,你可以使用这样的代码:

Board.find_by(name: params[:board_name]).posts.first(id).last

请记住,它会将与给定主板相关的所有帖子加载到内存中,因此如果您的主板有数百万个帖子,则性能可能会成为一个问题。