Ruby on rails Rails 5在创建子项时生成父项记录,前提是尚未存在
我有两种型号,用户和公司。我使用设备gem创建用户模型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, :
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,公司属性:[:公司名称])
结束
结束