Ruby on rails 如何使rails资源ID对每个用户都不唯一?
假设我有一个rails应用程序,供用户管理任务。 因此,当用户1创建任务时,它将具有以下URL:Ruby on rails 如何使rails资源ID对每个用户都不唯一?,ruby-on-rails,ruby-on-rails-4,Ruby On Rails,Ruby On Rails 4,假设我有一个rails应用程序,供用户管理任务。 因此,当用户1创建任务时,它将具有以下URL: user/task/1 现在,另一个用户(#2)创建了一个新任务,它将如下所示: user/task/2 如果第一个用户创建并添加另一个用户,则其编号为3。等等新任务不会反映用户拥有的任务量,而是反映存储在我的数据库中的资源量 我希望让每个用户创建任务,而不看系统中总共有多少任务。所以每个人都有任务1,2,3。。以及任务列表1、2、3 我想一种方法是使用一种新的自定义ID,并尝试将其放入URL中
user/task/1
现在,另一个用户(#2)创建了一个新任务,它将如下所示:
user/task/2
如果第一个用户创建并添加另一个用户,则其编号为3。等等新任务不会反映用户拥有的任务量,而是反映存储在我的数据库中的资源量
我希望让每个用户创建任务,而不看系统中总共有多少任务。所以每个人都有任务1,2,3。。以及任务列表1、2、3
我想一种方法是使用一种新的自定义ID,并尝试将其放入URL中。我接近了吗?也许有好的指南/更好的方法
谢谢如果我了解您想要实现的目标,我会这样做: 在您的任务模型中,我将添加:
用户添加所属的
user\u specific\u identifier
def index
@tasks = Task.where(user: current_user)
.where(user_specific_identifier: params[:id])
# ...
end
通过覆盖rails用作该模型ID的内容,您可以使用来让助手正常工作。但是,在ID不唯一的情况下,我没有这样做
您可能想签出RailsCast。最简单的方法是在用户记录上保留一个序号,当您需要新任务ID时,该序号会递增。然后,您将此ID存储在任务上,并在
任务
模型上覆盖#to_param
,以便Rails的URL帮助程序将其用于URL生成
因此,您需要进行迁移:
add_column :users, :task_count, :integer
add_index :users, :task_count, unique: true
add_column :tasks, :user_task_id, :integer
add_index :tasks, :user_task_id, unique: true
然后在任务模型上创建过滤器之前添加一个:
# Task
before_create :set_user_specific_id
def set_user_specific_id
self.user_task_id = self.user.get_next_task_id!
end
def to_param
self.user_task_id
end
# User
def get_next_task_id!
# Atomic increment is used here to prevent race conditions from generating dupe IDs
increment_counter :task_count
reload
self.task_count
end
现在,您可以使用URL帮助程序,如user\u task\u path(user,task)
生成使用特定于用户的ID而不是实际行ID的URL。您的查找程序将类似于task。其中(user\ID:params[:user\ID],user\u task\ID:params[:ID])
您想要任务的序号吗?例如,task/1
将始终是列表中的第一个任务,即使该任务发生变化。或者您想分配自定义ID,但要将其范围限定为用户?范围限定为用户,是的,在任何情况下,如果范围限定为用户,url将为users/100/tasks/1我考虑过这一点,但我认为它不起作用:friendly_ID希望“friendly ID”是唯一的,而在这种情况下,ID不是唯一的,我想他需要为此编写一个特定的路由。您不需要特定的路由,只需确保查询在控制器中的作用域正确(第一个where
所做的)。