我有一个小型的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相对于父板?
答案 0 :(得分:0)
我的提示:不要这样做,这很容易出错。
但如果你真的需要这个,你可以使用这样的代码:
Board.find_by(name: params[:board_name]).posts.first(id).last
请记住,它会将与给定主板相关的所有帖子加载到内存中,因此如果您的主板有数百万个帖子,则性能可能会成为一个问题。