2014-11-23 22 views
1

我有两个模型,TeamPlan。团队与计划有一对多的关系,计划可以有很多团队,每个团队都有一个计划。它看起来像这样:Rails 4 - 设置belongs_to关系不起作用

#Plan 
has_many :teams 

#Team 
belongs_to :plan 

我使用Stripe对于定期结算,以及我使用[webhooks][2],以保持我的应用程序与条纹同步。要接收条纹事件,我正在使用gem [stripe_event][3]。创建订阅时,我想将计划设置为新创建的订阅计划。当我得到的条纹事件customer.subscription.created我做到以下几点:

events.subscribe 'customer.subscription.created' do |event| 
    team = Team.find_by_stripe_customer_id(event.data.object.customer) 
    create_subscription_for_team(team, event.data.object) 

    # In this methods I want to set my plan 
    set_team_plan(team, event.data.object.plan) 
end 

def set_team_plan(team, plan) 
    team_plan = Plan.find_by_stripe_id(plan.id) 
    team.update_attribute(plan_id: team_plan.id) 
end 

我没有得到任何错误,我所看到的,但该计划似乎并没有得到更新。我也尝试过:

team.plan = team_plan 
team.save! 

但是,这给了我同样的结果。当我登录时,我已确认team_plan是正确的计划,不是零。

关于我在做什么错的任何想法?

回答

1

尝试添加反向关系:

#Plan 
has_many :teams, inverse_of: :plan 

#Team 
belongs_to :plan, inverse_of: teams 

逆关系有助于确保save作品当您保存子对象。

试着看一下每个项目的ID保存前后:

p "team_plan.id:#{team_plan.id}, team.plan.id: #{team.plan.id}" 
team.plan = team_plan 
p "team_plan.id:#{team_plan.id}, team.plan.id:#{team.plan.id}" 
team.save! 
p "team_plan.id:#{team_plan.id}, team.plan.id:#{team.plan.id}" 

如果您熟悉Rails的记录器,或pry,或调试,使用这些替代打印报表。 :)

+0

谢谢,是的,我确实尝试保存! (没有'!'是他的一种类型,现在我已经更新了我的问题)。当你设置'inverse_of'时,你会发现:ActionView :: Template :: Error(无法找到计划的反向关联(:在团队中)):' – Anders 2014-11-23 21:31:42

+0

@Anders我的错字 - 使用inverse_of:teams(复数) – joelparkerhenderson 2014-11-23 21:41:02

+0

其实它与别的东西有关系。在我的Team模型中,我有一个'before_create',我在那里设置了一个默认的'Plan'。当我的计划由于某种原因而被创建时,这个动作也被调用。 – Anders 2014-11-28 07:00:55