Ruby on rails Rails 5在创建子项时生成父项记录,前提是尚未存在

Ruby on rails Rails 5在创建子项时生成父项记录,前提是尚未存在,ruby-on-rails,Ruby On Rails,我有两种型号,用户和公司。我使用设备gem创建用户模型 class User < ApplicationRecord belongs_to :company accepts_nested_attribute_for :company devise :database_authenticatable, :registerable, :recoverable, :rememberable, :trackable, :validatable, :confirmable, :

我有两种型号,用户和公司。我使用设备gem创建用户模型

class User < ApplicationRecord
  belongs_to :company
  accepts_nested_attribute_for :company
  devise :database_authenticatable, :registerable,
     :recoverable, :rememberable, :trackable, :validatable, :confirmable, :lockable
end

class Company < ApplicationRecord
  has_many :users
end
class用户
当我创建用户时,我希望与他们关联他们所在的公司。我已经在用户创建表单中包含了company_name属性。我不希望company表中有多条记录用于同一company\u name属性

<% form_for(@user) do |user_form| %>
  <% user_form.fields_for :company do |company_form| %>
    <%= company_form.label :company_name %>
    <%= company_form.text_field :company_name %>
  <% end %>
# other fields for user
<% end %>

#用户的其他字段
我想检查用户关联的公司是否已存在于公司表中。仅当公司尚未创建新记录时,才为其创建新记录。

class Userclass User < ApplicationRecord
  before_save :create_or_initialize_company

  private
  def create_or_initialize_company
    Company.where("name ILIKE '%#{company_name}%'").first_or_create
  end
end
保存前:创建或初始化公司 私有的 def创建或初始化公司 Company.where(“name ILIKE”%{Company\u name}%”)。首先\u或\u创建 结束 结束 现在,您可以根据自己的需求进行两种变化,例如:。 如果您想要精确匹配,则
。其中(名称:公司名称)
如果不需要不区分大小写的匹配,请将
ILIKE
替换为
LIKE

希望它能帮助..

类用户控制器class UsersController < ApplicationController
  def create
    @user = User.new(user_params)
    assign_new_or_existing_company(@user)

    if @user.save
    # ...
  end

  def update
    @user = User.find(params[:id])
    @user.assign_attributes(user_params)
    assign_new_or_existing_company(@user)

    if @user.save
    # ...
  end

  private

  def assign_new_or_existing_company(user)
    user.company = Company.where(
      'company_name ILIKE ?',
      "%#{user_params[:company_attributes][:company_name]}%"
    )
    .first_or_initialize(user_params[:company_attributes])
  end

  def user_params
    params.require(:user).permit(:id, company_attributes: [:company_name])
  end
end
def创建 @user=user.new(用户参数) 分配新公司或现有公司(@user) 如果@user.save # ... 结束 def更新 @user=user.find(参数[:id]) @用户。分配属性(用户参数) 分配新公司或现有公司(@user) 如果@user.save # ... 结束 私有的 def分配新公司或现有公司(用户) user.company=company.where( “我喜欢什么公司?”, “%#{user_params[:company_attributes][:company_name]}%” ) .第一个\u或\u初始化(用户参数[:公司\u属性]) 结束 def用户参数 参数require(:user).permit(:id,公司属性:[:公司名称]) 结束 结束