Rails嵌套关联并重新启动编号

set*_*rgo 2 ruby-on-rails ruby-on-rails-3

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

resources :users
  resources :posts
end
Run Code Online (Sandbox Code Playgroud)

和a user has_many posts,Rails可以根据URL中的父关联开始编号吗?例如,目前,嵌套资源只是获取ID:

@user.posts.find(params[:id])
Run Code Online (Sandbox Code Playgroud)

这正确命名空间的帖子,只允许来自@user...但是,有没有一种方式使其post_id独立?IE我希望每个用户的帖子从1开始,其中:

/users/1/posts/1
/users/2/posts/1
Run Code Online (Sandbox Code Playgroud)

实际上是指两个不同的帖子?

Azo*_*olo 6

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

  1. 创建迁移以添加新属性以存储特定的用户发布计数.(我用过user_post_id)
  2. 覆盖Postto_param方法,用刚刚创建的新的价值.(它必须是一个字符串.)
    • to_paramurlpath助手使用的方法.
  3. 创建一个before_save过滤器,实际上会增加user_post_id每个新帖子的值.
  4. 更改所有控制器方法以查找 user_post_id

    @user = User.find(params[:user_id])
    @post = @user.posts.where(:user_post_id => (params[:id])).first
    
    Run Code Online (Sandbox Code Playgroud)
  5. 更改可能现在不起作用的所有视图

您可以在此处查看源:自定义嵌套资源URL示例

移民:

class AddUserPostIdToPosts < ActiveRecord::Migration
  def change
    add_column :posts, :user_post_id, :integer
  end
end
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

一对夫妇控制器方法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
Run Code Online (Sandbox Code Playgroud)