Ruby on Rails除了ID之外还按字段查找

好吧再次忘记我在Rails中的喧嚣,但我也没有找到它。 虽然我认为这个可能是因为它…它不存在?

好的,所以我还在玩RoR,我为员工添加了一个控制器,非常简单,只需要一个名字,clock_no和工资。 但是,如果我不想通过ID搜索员工呢? 对我来说,用户按时钟编号搜索会更容易,但我不知道它是如何工作的。 我假设它与此行有关,更具体地说是set_employee行:

private # Use callbacks to share common setup or constraints between actions. def set_employee @employee = Employee.find(params[:id]) end # Never trust parameters from the scary internet, only allow the white list through. def employee_params params.require(:employee).permit(:name, :clock_no, :wage) end 

不过我可能会离开。

好的,所以我的解决方案最终只是为了更改模型中的primary_key:

 self.primary_key = 'clock_no' 

并将返回设置为json:

 def show @employee = Employee.find(params[:id]) respond_to do |format| format.html format.json { render json: @employee } end end 

但是,我不认为这真的是最终所有的解决方案,再次我的高傲可能会显示出来,但它似乎对我来说有点儿。 如果你想通过说出名字或其他不是主键的东西进行搜索并且无法像我的情况那样更改主键,那么我会坚持下去? 鼻子回到文档

用于:

 Employee.where(clock_no: params[:clock_no]) 

返回一个ActiveRecord关系,所以如果你需要第一个(并且可能只有clock_no是唯一的实例), first使用,如下所示:

 Employee.where(clock_no: params[:clock_no]).first 

这将只执行一个SQL查询以获得匹配clock_no的第一个Employee。

曾经有像find_by_clock_no这样的魔术搜索器,但是从Rails 4开始不推荐使用它们,我假设你正在使用它们。

有关ActiveRecord查询的更多信息,另请参阅Rails文档 。

尝试使用基于动态属性的查找程序,如下所示:

  Employee.find_by_clock_no(params[:clock_no]) 

查看文档以获取更多信息。