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
模型中。