ruby-on-rails 如何在Rails 7中不使用数字索引从数据库中检索用户信息?

oewdyzsn  于 12个月前  发布在  Ruby
关注(0)|答案(2)|浏览(102)

最初,我会使用这样的路线:

www.example.com/users/3

字符串
用户ID为3,然后通过索引从数据库中检索用户信息,复杂度为O(1)。
但我已经改变了路由,以取代用户名,而不是ID这样:

www.example.com/users/john


如果是O(n)的话,时间复杂度是O(n)的。

mwecs4sa

mwecs4sa1#

当您传递user_id时,查询将是
User.find_by(id: user_id)
当您传递user_name时,查询将是
User.find_by(user_name: user_name)
不是rails,是DB
您应该为user_name优化add index

def change
  add_index :users, :user_name
end

字符串

mbyulnm0

mbyulnm02#

添加:name索引就可以了,然后相应地更新路由、模型和控制器,默认情况下知道它是唯一的。使其唯一将为您提供与通过主键(id)进行查找相同的查询性能。

# migration 
def change
  # not sure why you'd name it user_name as opposed to name
  add_index :users, :name, unique: true
end

x

# model
class User < ApplicationModel
  validate :name, presence: true, uniqueness: true

  # ensures path generators use name as param
  def to_param
    name
  end
end
# routes 
resources :user, param: :name
# controller
class UserController
  # if you have a controller method handling the lookup by param, rails adds the find_by_COLUMN method 
  def set_user
    @user = User.find_by_name params[:name]
  end
end

的数据
另外,为了澄清可能听起来像是混淆的地方:迁移在Name上创建了一个非聚集索引,它存储了相应记录(用户记录)的ID,比如:

Name | ID
Bob  | 1
Jil  | 2


该名称作为此表中的主键,允许通过URL中提供的单个参数处理查找,而无需任何数值数据。

相关问题