我可以在保存之前在模型中进行Find_Or_Create吗?

时间:2014-06-09 21:25:39

标签: ruby-on-rails ruby model-view-controller ruby-on-rails-4 model

  • 所以我希望将find_or_create函数从我的控制器移动到我的模型。基本上,如果位置已经存在,那么选择它,如果没有,则创建一个新位置。从一点阅读开始,我认为保存之前的功能应该是这样,但是我不确定正确的语法,并且似乎无法在任何地方找到很多例子。

Location.rb

before_save :get_locations

def get_locations
      Location.find_or_create_by(name: [:name])
end  

这是我的控制者;在这里运行find_or_create时工作正常。

Locations_controller.rb

def create
   @location = Location.new(location_params) 

# == worked previously ==  #
# @location = Location.find_or_create_by(name: location_params[:name])
# == worked previously ==  #    

    respond_to do |format|
...
      end
    end

帮助会很棒!

1 个答案:

答案 0 :(得分:0)

首先,我会尝试猜测,你想在那里做什么。考虑到您给我们的内容,您试图阻止创建具有相同名称的多个位置,如果用户尝试这样做,请找到已创建的位置而不是创建新位置。

如果这是真的,那么就要提到一些事情:

  1. 你不需要任何before_create方法。所有模型都需要进行validates_uniqueness_of :name调用,因此永远不会有2个具有相同名称的位置。
  2. 您需要将创建逻辑移回控制器。您可以使用find_or_initialize_by(name:location_params[:name])调用(如果您想在之后使用找到的记录执行某些操作)或find_or_create_by(name:location_params[:name])(立即创建它)。
相关问题