【问题标题】:Can I do Find_Or_Create in model before save?我可以在保存之前在模型中执行 Find_Or_Create 吗?
【发布时间】:2014-07-30 12:40:57
【问题描述】:
  • 所以我希望将 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

帮助会很棒!

【问题讨论】:

  • 不清楚您要达到的目标。你为什么把这个逻辑转移到一个模型中——如果这些模型彼此不相关,你就不应该这样做。此外,您的 get_locations 方法绝对什么也不做,除了浪费时间进行不需要的 sql 查询以获取稍后将被丢弃的记录。请更新您的问题,详细说明您想要实现的目标。
  • 在模型中你已经创建了无限循环,因为create触发before_save过滤器。
  • 您是否正在寻找控制器的before_action 回调?
  • 嗨@BroiSatse - Aplogies,模型是相关的(一篇文章有​​很多位置)。我希望在保存之前捕获该位置并检查它是否存在。如果是,请引用它,如果不是,请创建它。
  • @maringan - 不确定保存之前是否是正确的回调。接受建议。这对我来说最有意义。

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


【解决方案1】:

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

如果这是真的,那么有几件事要提一下:

  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])(立即创建它)。

【讨论】:

  • 嗨@Almaron。如果我尝试保存具有相同名称的模型,这不会引发验证错误吗?我仍然希望提交成功 - 但只是为了找到当前存在的记录。我知道我可以在控制器中执行此操作 - 是否可以在模型中执行此操作?
  • 我认为这种逻辑属于控制器。 find_or_create_by 应该会让表单提交成功。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
  • 2018-04-14
  • 1970-01-01
  • 2012-03-26
  • 1970-01-01
  • 1970-01-01
  • 2018-06-05
相关资源
最近更新 更多