Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/52.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何使rails资源ID对每个用户都不唯一?_Ruby On Rails_Ruby On Rails 4 - Fatal编程技术网

Ruby on rails 如何使rails资源ID对每个用户都不唯一?

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中

假设我有一个rails应用程序,供用户管理任务。 因此,当用户1创建任务时,它将具有以下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
    所做的)。