Rails 4 ActiveRecord,如果记录存在,请使用id,否则创建一个新记录

好奇的观察者

创建员工后,将为其授予标题。如果标题是唯一的,则记录将正常保存。如果标题不是唯一的,我想找到现有的标题,并改用它。我不知道如何在create动作中做到这一点。

雇主

class Employee < ActiveRecord::Base
  belongs_to :title, :class_name => :EmployeeTitle, :foreign_key => "employee_title_id"
  accepts_nested_attributes_for :title
end

loyal_title.rb

class EmployerTitle < ActiveRecord::Base
  has_many :employees
  validates :name, presence: true, length: { maximum: 50 },
            uniqueness: { case_sensitive: true }
end

new.html.erb

<%= f.simple_fields_for :title do |title| %>
    <%= title.input :name, label: "Title" %>
<% end %>

employee_controller.rb

def create
  if EmployeeTitle.exists?(name: employee_params[:title_attributes][:name])
    # find title and use it?
  else
    @employee = current_user.employee.build(employee_params)
  end
  if @employee.save
    flash[:success] = "Employee #{@employee.title.name} created."
    redirect_to @employee
  else
    render 'new'
  end
end

编辑:使用first_or_create

def create
  EmployeeTitle.where(name: employee_params[:title_attributes][:name]).first_or_create do |title|
    @employee = current_user.employees.build(employee_params, :title => title)
  end
  if @employee.save
    flash[:success] = "Employee #{@employee.title.name} created."
    redirect_to @employee
  else
    render 'new'
  end
end

这使@employee超出范围。错误:nil:NilClass的未定义方法“保存”。

此外,如果我这样做,则无论其余员工数据是否有效,都不会创建标题吗?

使用私有方法

employee.rb

  private
    def title_attributes=(attributes)
      self.title = EmployeeTitle.find_or_create_by_name(name: attributes[:name])
    end

尚未设置该值。我收到“不能为空”的验证错误。参数包括

employee: !ruby/hash:ActionController::Parameters
  title: !ruby/hash:ActiveSupport::HashWithIndifferentAccess
    name: Consultant

!ruby / hash:ActiveSupport :: HashWithIndifferentAccess以前不存在。

employee_params

  private
    def employee_params
      params.require(:employee).permit(
          title_attributes: [:id, :name],
      )
    end
苏里亚

您需要做的是更改此设置:

def create
  if EmployeeTitle.exists?(name: employee_params[:title_attributes][:name])
    # find title and use it?
  else
    @employee = current_user.employee.build(employee_params)
  end
  if @employee.save
    flash[:success] = "Employee #{@employee.title.name} created."
    redirect_to @employee
  else
    render 'new'
  end
end

有了这个:

def create
  @employee = current_user.employee.build(employee_params)
  if @employee.save
    flash[:success] = "Employee #{@employee.title.name} created."
    redirect_to @employee
  else
    render 'new'
  end
end

现在,title_attributes通过将以下代码放在您的app / models / employee.rb文件中来覆盖方法

def title_attributes=(attributes)
  self.title = EmployeeTitle.find_or_create_by_name(attributes[:name])
end

现在,每次您创建一个名称已经与特定名称一起存在的员工时,默认情况下将使用该员工将其与关联title让控制器像以前一样

find_or_create_by在此处阅读有关方法的更多信息

但是,您的问题标题是:Rails 4,但您已标记ruby-on-rails-3.2。如果您使用的是Rails 4,则可以改用以下方法:

EmployeeTitle.find_or_create_by(name: attributes[:name])

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Rails ActiveRecord.new创建一个新记录,而不是更新现有记录

来自分类Dev

如果记录有两个条件,如何获取Rails 4返回true否则返回false?

来自分类Dev

如果记录有两个条件,如何获取Rails 4返回true,否则返回false?

来自分类Dev

Rails 4表单-在一个表中创建记录,在另一个表中更新记录。怎么样?

来自分类Dev

Rails 4:通过has_many关联创建新记录

来自分类Dev

Rails 4活动记录查询

来自分类Dev

Rails 4不更新记录

来自分类Dev

用rails更新记录4

来自分类Dev

如何在活动记录/ Rails 4迁移中创建具有唯一索引的新表

来自分类常见问题

禁用ActiveRecord for Rails 4

来自分类Dev

rails 4 ActiveRecord :: StatementInvalid

来自分类Dev

Rails 4 ActiveRecord :: AssociationTypeMismatch

来自分类Dev

Rails 4 ActiveRecord组

来自分类Dev

rails 4 ActiveRecord :: StatementInvalid

来自分类Dev

Rails 4创建新标签

来自分类Dev

使用RVM创建新的Rails 4应用

来自分类Dev

Ruby on Rails:创建一个属于另一个模型的新记录

来自分类Dev

使用Rails 4 Activerecord将多个列数合并为一个查询

来自分类Dev

Rails, activerecord, 从 hstore 记录中删除一个键值对

来自分类Dev

在Rails 4中创建一个xml文件

来自分类Dev

导入CSV并更新记录(如果在rails中存在)4

来自分类Dev

Rails 4中的ActiveRecord :: AssociationTypeMismatch

来自分类Dev

Rails 4多个ActiveRecord关联

来自分类Dev

Rails 4茧ActiveRecord :: AssociationTypeMismatch

来自分类Dev

Rails 4 ActiveRecord多个查询

来自分类Dev

Rails 4错误:ActiveRecord :: AssociationTypeMismatch

来自分类Dev

用于更新Rails 4中记录的新表格

来自分类Dev

Rails 4,如何用行号记录文件

来自分类Dev

如何禁用Rails 4缓存的日志记录

Related 相关文章

热门标签

归档