要做到這一點,最簡單的方法是在用戶記錄上保留一個序號,當你需要一個新的任務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 –