2014-11-23 2 views
1

У меня есть две модели, Team и Plan. У команды есть от одного до многих отношений с планами, где планы могут иметь много команд, и каждая команда имеет один план. Это выглядит следующим образом:Rails 4 - установка принадлежит_от отношения не работает

#Plan 
has_many :teams 

#Team 
belongs_to :plan 

Я использую Stripe для повторяющихся счетов, и я использую [webhooks][2], чтобы мое приложение синхронизировано с полоской. Чтобы получать события Stripe, я использую драгоценный камень [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 работы при сохранении подобъектов.

Постарайся глядя на идентификатор каждого элемента до и после сохранения:

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 (Не удалось найти обратную ассоциацию для плана (: команда в Plan)): ' – Anders

+0

@Anders My typo - используйте inverse_of: teams (множественное число) – joelparkerhenderson

+0

На самом деле это было связано с чем-то другим. В моей модели «Team» у меня было «before_create», где я установил «План» по умолчанию. Это действие вызвано также, когда мой План создается по какой-то причине. – Anders

Смежные вопросы