2014-01-21 101 views
0

假設我有一個Rails應用程序供用戶管理任務。 因此,當用戶1創建一個任務,將有下列網址:如何讓每個用戶的rails資源id不唯一?

user/task/1 

現在另一個用戶(#2)創建一個新的任務,它看起來像:

user/task/2 

如果第一個用戶將創建添加另一個它將有數字3.等等。新任務不會反映用戶擁有的任務數量,而是存儲在我的數據庫中的資源數量。

我希望每個用戶都能創建任務,而不必查看系統中總共有多少任務。所以每個人都可以有任務1,2,3 ..以及任務列表1,2,3 ..

我想一個辦法是有一個新的自定義類型的ID並嘗試將其放入URL 。我關門了嗎?也許有一個很好的指導/更好的方法?

感謝

+0

你想要任務的序號嗎?例如'task/1'將始終是列表中的第一個任務,即使該更改。或者你想分配自定義ID的,但讓他們的範圍爲用戶? – csexton

+0

範圍爲用戶,是 –

+0

好在任何情況下,如果是作用域的用戶url將用戶/ 100 /任務/ 1 –

回答

0

如果我知道你想完成什麼,我這樣做:

在你的任務模式,我想補充:

  1. 添加belongs_touser
  2. 添加一個整數列user_specific_identifier

然後在控制器確保範圍查詢使用的用戶:

def index 
    @tasks = Task.where(user: current_user) 
       .where(user_specific_identifier: params[:id]) 
    # ... 
end 

您可能能夠使用to_param讓你的助手通過重寫作爲ID爲模型什麼Rails使用正常工作。但是,在ID不唯一的情況下,我還沒有這樣做。

您可能想要結帳RailsCast #314 Pretty URLs with FriendlyId

+0

我想過這個,但我不認爲它會工作:friendly_id期望「友好的ID」是唯一的,在這種情況下ids不是唯一的,他需要爲此編寫一個特定的路線。 –

+0

你不應該需要一個特定的路由,只要確保查詢在控制器中的適當範圍(第一個「where」是什麼)。 – csexton

0

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

相關問題