Ruby on rails Rails嵌套关联和重新开始编号

Ruby on rails Rails嵌套关联和重新开始编号,ruby-on-rails,ruby-on-rails-3,Ruby On Rails,Ruby On Rails 3,如果我有这样的嵌套资源: resources :users resources :posts end 一个用户有许多帖子,是否可以让Rails根据URL中的父关联开始编号?例如,当前,嵌套资源仅获取ID: @user.posts.find(params[:id]) 这将正确命名帖子的名称空间,只允许来自@user。。。但是,是否有一种方法使得post\u id是独立的?即,我希望每个用户的帖子从1开始,其中: /users/1/posts/1 /users/2/posts/1 实际上是

如果我有这样的嵌套资源:

resources :users
  resources :posts
end
一个
用户
有许多
帖子
,是否可以让Rails根据URL中的父关联开始编号?例如,当前,嵌套资源仅获取ID:

@user.posts.find(params[:id])
这将正确命名帖子的名称空间,只允许来自
@user
。。。但是,是否有一种方法使得
post\u id
是独立的?即,我希望每个用户的帖子从1开始,其中:

/users/1/posts/1
/users/2/posts/1

实际上是指两篇不同的文章吗?

这可能是相当多的工作,但基本上你可以通过以下步骤来完成:

  • 创建迁移以添加新属性来存储特定的用户post计数。(我使用了
    user\u post\u id
  • 重写
    Post
    to_param
    方法以使用刚刚创建的新值。(必须是字符串。)
    • to_param
      url
      path
      助手使用的方法
  • 在保存之前创建一个
    过滤器,该过滤器将实际增加每个新帖子的
    用户帖子id
  • 更改所有控制器方法,以便在
    user\u post\u id

    @user = User.find(params[:user_id])
    @post = @user.posts.where(:user_post_id => (params[:id])).first
    
  • 更改所有现在可能不起作用的视图
  • 您可以在此处看到源代码:

    代码 迁移:

    class AddUserPostIdToPosts < ActiveRecord::Migration
      def change
        add_column :posts, :user_post_id, :integer
      end
    end
    
    class AddUserPostedToposts
    post.rb:

    class Post < ActiveRecord::Base
      before_save :set_next_user_post_id
      belongs_to :user
    
      validates :user_post_id, :uniqueness => {:scope => :user_id}
    
      def to_param
        self.user_post_id.to_s
      end
    
    private
      def set_next_user_post_id
        self.user_post_id ||= get_new_user_post_id
      end
    
      def get_new_user_post_id
        user = self.user
        max = user.posts.maximum('user_post_id') || 0
        max + 1
      end
    end
    
    class Post{:scope=>:user\u id}
    def至_参数
    self.user\u post\u id.to\s
    结束
    私有的
    def set_next_user_post_id
    self.user_post_id | |=获取_new_user_post_id
    结束
    def get_new_user_post_id
    user=self.user
    max=user.posts.max('user_post_id')|| 0
    最大值+1
    结束
    结束
    
    一对控制器方法 posts_controller.rb:

    class PostsController < ApplicationController
      respond_to :html, :xml
    
      before_filter :find_user
    
      def index
        @posts = @user.posts.all
        respond_with @posts
      end
    
      def show
        @post = @user.posts.where(:user_post_id => (params[:id])).first
        respond_with [@user, @post]
      end
      ...
    end
    
    class PostsController(params[:id])。首先
    用[@user,@post]回复_
    结束
    ...
    结束
    
    id
    是共享的,因为所有用户对象都共享一个
    posts
    表。每个用户都需要一个单独的表,以便使用:id对每个“Post”或drop进行个性化处理,并使其成为一些其他属性,这些属性由模型根据用户关联手动递增。让用户模型将索引分配给Post不是更有意义吗?这样,Posts模型就不需要深入到Users模型中,我不这么认为。
    User
    模型每次都会进入
    posts
    集合。我认为你不会通过改变它来降低复杂性,相反,复杂性只会被移动。由于
    User
    不需要了解
    Post
    模型是如何耦合的,因此我将其放在
    Post
    模型中。