Rails:在创建父级时传递子记录的参数

时间:2013-07-19 09:33:08

标签: ruby-on-rails activerecord

这是一个严肃的rails新手。我知道我可以在模型中使用before_saveafter_save钩子来控制在创建父级时编写has_many记录,但我不知道如何传递我想要创建的值在那个儿童记录中。

在我的方案中,用户has_many memberships到学校。目前,当我创建用户时,它会创建一个空白的membership记录,该记录没有正确的初始值。如何将用户需要输入的值传递给init?

中的has_many记录

我一直在做的是在用户之后手动创建会员记录,但这会给我两个会员资格,一个具有正确的字段值,一个具有初始" nil"值,以及我手动创建的记录。在我的测试中

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更新为a)那么多SQL次操作和b)会无法获得刚刚为该用户创建的正确记录。

因为我的用户通过会员资格与学校建立了关系,所以我希望能够找到一种方法将school_id传递给用户,nested_attributes会插入school_id

我想要的是在创建用户时填充学校和角色,并让这些创建会员记录。我认为这与before/after钩子有关,但是我想知道最好的解决方案

提前致谢

修改

所以,这是我在测试中使用的代码,使用Factory Girl。也许这是问题的一部分 - 如果我使用rails控制台,我会得到这个     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可能也许是回答者?

0 个答案:

没有答案