2017-04-24 8 views
0

私は2つのモデルUserとCompanyを持っています。私はユーザモデルの作成にデバイスの宝石を使用しました。私は、ユーザーを作成するとRails 5は、まだ作成されていない場合のみ、子作成時に親レコードを生成します。

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 

は、私は彼らと彼らが働いている会社を関連付けたい。私は、ユーザー作成フォームでCOMPANY_NAME属性が含まれています。私が望まないのは、同じcompany_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 %> 

ユーザーが関連付けられているかどうか、会社のテーブルに既に存在するかどうかを確認したいと思います。まだ存在していない場合にのみ、会社の新しいレコードを作成します。

答えて

0
class 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 

ここでは、要件に基づいていくつかのバリエーションを行うことができます。 完全一致の場合は.where(name: company_name) 大文字と小文字を区別しないようにする場合は、ILIKELIKEに置き換えてください。

0
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 
+0

おかげで、それが働いていた...それがお役に立てば幸い –

関連する問題