需要解释belongs_to关联详细参考build_association(attributes = {})

时间:2014-03-22 16:48:56

标签: ruby-on-rails associations

我有两个模特。

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

但我觉得第一种方式应该有效。

1 个答案:

答案 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_subscriptionuser

希望这有帮助。