Ruby on Rails按ID除外

时间:2013-07-19 21:30:00

标签: ruby-on-rails

好吧再次忘记我在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

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

3 个答案:

答案 0 :(得分:16)

使用where

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

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

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

这将只执行一个SQL查询,以使第一个Employee匹配clock_no

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

有关ActiveRecord查询的详细信息,请参阅Rails documentation

答案 1 :(得分:3)

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

    Employee.find_by_clock_no(params[:clock_no])

查看docs了解详情。

答案 2 :(得分:0)

我认为现在下一个语法是首选:

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