要做到这一点,最简单的方法是在用户记录上保留一个序号,当你需要一个新的任务ID时,这个序号会增加。然后,您将在该任务上存储此ID,并在您的Task
模型上覆盖#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
然后加上你的任务模型before_create
过滤器:
# 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
现在你可以使用你的网址助手像user_task_path(user, task)
生成网址使用用户特定的ID,而不是实际的行ID。你的发现者将会像Task.where(user_id: params[:user_id], user_task_id: params[:id])
一样。
你想要任务的序号吗?例如'task/1'将始终是列表中的第一个任务,即使该更改。或者你想分配自定义ID的,但让他们的范围为用户? – csexton
范围为用户,是 –
好在任何情况下,如果是作用域的用户url将用户/ 100 /任务/ 1 –