0

これは真剣にrails初心者です。before_save親を作成するときに has_many レコードの書き込みを制御するためにモデルでandフックを使用できることはafter_saveわかっていますが、その子レコードで作成したい値を渡す方法がわかりません。

has_many memberships私のシナリオでは、学校へのユーザーです。現在、ユーザーを作成するとmembership、正しい初期値を持たない空白のレコードが作成されます。初期化時に has_many レコードに挿入する必要がある値をユーザーに渡すにはどうすればよいですか?

私が行っているのは、ユーザーの後にメンバーシップ レコードを手動で作成することですが、これにより、2 つのメンバーシップが得られます。

class User
  has_many :memberships
  has_many :group_user_memberships
  has_many :schools, through: :memberships 


  #creates a  membership with nil values in some fields
   @user = create(user_type)

  #creates the correct, but secondary memberhsip
   member = @user.memberships.create(school_id: school.id, role_id: role.id)

私がやりたくないのは、ユーザーを作成し、メンバーシップIDを見つけてから、メンバーシップのschool_idを更新する必要があることSQLです。そのユーザーのために作成されたばかりです。

school_id私のユーザーはメンバーシップを通じて学校と関係を持っているため、をユーザーに渡す方法を見つけて、nested_attributes挿入する方法を見つけたいと思っていましたschool_id

私が望むのは、ユーザーの作成時に学校と役割を入力し、これらにメンバーシップ レコードを作成させることです。これはフックに関連していると思いますbefore/afterが、最善の解決策を知りたいです

前もって感謝します

編集

これは、Factory Girl を使用してテストで使用するコードです。たぶんこれは質問の一部です-レールコンソールを使用すると、これが得られます u = User.create(:firstname => "Dsd", :surname => "", :email => "aa@sdd.com" ) u.confirm!

メンバーシップなしでユーザー SQL 挿入を取得します (または、少なくともログにメンバーシップ INSERT が表示されません)

INSERT INTO `users` (`active`, `confirma..... etc

私のテストでは、Factory Girl を使用してメンバーシップを取得しました。これはファクトリーガールかもしれませんが、ファクトリーのどこでメンバーシップを取得しているのかわかりません. これが私のユーザーファクトリーです

FactoryGirl.define do
  factory :user do
sequence(:email){ |n| "user#{n}@example.com".downcase }
    firstname "MyString"
    surname "MyString"
    password "a1234567"
    active false

    factory :an_administrator do
      after(:create){|a| a.roles << create(:admin_role)}
    end
    factory :a_pupil do
       after(:create){|a| a.roles << create(:pupil_role)}
    end
  end
end

そして私の役割工場

FactoryGirl.define do
  factory :role do
    factory :admin_role do |f|
      name 'administrator' 
    end  
    factory :pupil_role do |f|
      name 'pupil'
    end
  end
end

はい、これは Factory Girl だと思います - user_with_school_membership を作成することがおそらく答えになるでしょうか?

4

0 に答える 0