2014-01-21 67 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])一样。

相关问题