# 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
2条答案
按热度按时间mwecs4sa1#
当您传递
user_id
时,查询将是User.find_by(id: user_id)
个当您传递
user_name
时,查询将是User.find_by(user_name: user_name)
个不是
rails
,是DB
您应该为
user_name
优化add index字符串
mbyulnm02#
添加:name索引就可以了,然后相应地更新路由、模型和控制器,默认情况下知道它是唯一的。使其唯一将为您提供与通过主键(id)进行查找相同的查询性能。
x
的数据
另外,为了澄清可能听起来像是混淆的地方:迁移在Name上创建了一个非聚集索引,它存储了相应记录(用户记录)的ID,比如:
型
该名称作为此表中的主键,允许通过URL中提供的单个参数处理查找,而无需任何数值数据。