我有两个模特。
user.rb
class User < ActiveRecord::Base
has_many :trial_subscriptions
attr_accessible :trial_subscriptions_attributes
end
在我的trial_subscription.rb
中模型是
class TrialSubscription < ManualSubscription
end
请注意,ManualSubscription模型继承自订阅模型,此模型具有
belongs_to :user
我正在尝试使用活动记录指南中的4.1.1.3 build_association(attributes = {})
来构建用户。我需要一些更详细的解释。
在我的rails控制台中,我正在执行以下操作以及我对以下内容的推理
@subscription = TrialSubscription.new() #creating a new object
@user = @subscription.build_user(email: 'blahblahblah@gmail.com', password:'eightcharacterslong')#building the user
@user.save #saving the user permanently
User.last #saved user shows up
但是当我执行以下操作时
@a = User.last
@a.trial_subscriptions
我得到一个空数组。
当我这样做时
Trial_Subscription.last, there is no extra record (the TrialSubscription.new ? )
我希望最后的trial_subscription记录有
user_id #be filled in with the build user that I just created.
一些解释会很棒!
这些代码将转到我的trial_subscriptions_controller.rb,并会有一个表单发布用户输入的信息。
我也注意到我可以做一个
@user.trial_subscriptions.create!() #and then maybe a @user.save
但我觉得第一种方式应该有效。
答案 0 :(得分:1)
让我们先看看你的两个模特:
# app/models/user.rb
class User < ActiveRecord::Base
has_many :trial_subscriptions
attr_accessible :trial_subscriptions_attributes
end
# app/models/trial_subscription.rb
class TrialSubscription < ManualSubscription
end
讨论的重点应该是您对attr_accessible :trial_subscriptions_attributes
的使用,这样做可以trial_subscriptions_attributes
进行质量分配。现在需要注意的是,无论您定义哪个模型attr_accessible :association_attributes
都应该是用于创建关联的模型。
下一个讨论要点是mass_assignment
。您已允许trial_subscriptions_attributes
进行质量分配,但trial_subscriptions_attributes
不是模型类User
的成员属性。您有trial_subscriptions
但不是trial_subscriptions_attributes
。您可以简单地为trial_subscriptions_attributes
定义一个getter和setter,但是Rails已经为关联提供了accepts_nested_attributes_for
帮助器。因此,请更新您的模型User
以添加accepts_nested_attributes_for :trial_subscriptions
:
# app/models/user.rb
class User < ActiveRecord::Base
has_many :trial_subscriptions
accepts_nested_attributes_for :trial_subscriptions
attr_accessible :trial_subscriptions_attributes
end
通过此设置,您应该能够创建具有相关试用订阅的用户:
@user = User.new(email: 'blahblahblah@gmail.com', password:'eightcharacterslong')
@subscription = @user.trial_subscriptions.build
@user.save #saving the user permanently
User.last // Shows last user
User.last.trial_subscriptions #shows last users trial subscriptions
使用您通过试用订阅创建用户的方法,您需要在accepts_nested_attributes_for
模型而不是attr_accessible
模型中定义trial_subscription
和user
。
希望这有帮助。