Свяжите модель подписки с моделью пользователя

У меня есть настройки Stripe и PayPal по модели подписки. Мне нужна помощь в понимании того, как создать связь между подпиской и моделью пользователей.

Любая помощь в этом будет принята с благодарностью.

Модель подписки:

    belongs_to :plan
      validates_presence_of :plan_id
      validates_presence_of :email

      attr_accessor :stripe_card_token, :paypal_payment_token

      def save_with_payment
        if valid?
          if paypal_payment_token.present?
            save_with_paypal_payment
          else
            save_with_stripe_payment
          end
        end
      end

      def paypal
        PaypalPayment.new(self)
      end

      def save_with_paypal_payment
        response = paypal.make_recurring
        self.paypal_recurring_profile_token = response.profile_id
        save!
      end

      def save_with_stripe_payment
        customer = Stripe::Customer.create(description: email, plan: plan_id, card: stripe_card_token)
        self.stripe_customer_token = customer.id
        save!
      rescue Stripe::InvalidRequestError => e
        logger.error "Stripe error while creating customer: #{e.message}"
        errors.add :base, "There was a problem with your credit card."
        false
      end

      def payment_provided?
        stripe_card_token.present? || paypal_payment_token.present?
      end

  def cancel_recurring
     response = ppr.cancel_subscription(at_date_end: true)
     self.current_date_end_at = Time.at(response.current_date_end)
     self.plan_id = plan.id
     self.status = "canceled"
     return self.save
   end
    end

person xps15z    schedule 04.03.2014    source источник


Ответы (1)


Я бы, вероятно, имел has_one -> own_to между пользователями и подписками. Подписка имеет много атрибутов, которые могут сильно меняться с течением времени, и при разработке чего-либо один из первых вопросов, который вы должны задать: «Что изменится со временем?»

Затем вы можете создать метод subscribed? для пользователя для синтаксического сахара.

class User < ActiveRecord::Base
  has_one :subscription

  def subscribed?
    subscription.present?
  end
end

class Subscription < ActiveRecord::Base
  belongs_to :user
end

Вам понадобится столбец в таблице подписки для user_id, чтобы вы могли правильно использовать ассоциацию.

Кроме того, при миграции вы можете добавить этот столбец, используя belongs_to (если вы используете более новую версию Rails:

create_table :subscriptions do |t|
  t.belongs_to :user
  t.string :account_id
  t.timestamps
end

Если у вас все настроено правильно, то это должно работать в rails console:

User.first.subscription # => Subscription<>
Subscription.first.user # => User <>
person WattsInABox    schedule 04.03.2014
comment
Спасибо за ответ. Мне ясно, как добавить отношения между моделями. Мне нужна помощь в понимании того, как создать действие. Например, когда пользователь платит и таблица подписки обновляется токеном и адресом электронной почты, как я могу обновить таблицу пользователей, чтобы показать, что идентификатор пользователя 12 теперь подписан на план 1. Установка модели подписки на own_to — это первый небольшой шаг. , вот почему я знаю, как это сделать, ха-ха. - person xps15z; 04.03.2014
comment
Пока у вас есть столбец _id в таблице contains_to, Rails должен заполнить его за вас. В вашем случае добавление user_id в таблицу подписки. - person WattsInABox; 05.03.2014
comment
Подождите, может быть, я немного неправильно понимаю вашу настройку. Итак, у вас есть план, подписка и Пользователь. У пользователя есть одна подписка, и подписка будет указывать на план, да? Кроме того, вы хотите удалить/обновить подписку или вам нужна новая запись каждый раз, когда она изменяется (для исторических целей)? - person WattsInABox; 05.03.2014
comment
Да. У меня есть таблица планов (включает идентификатор, имя, цену, длину). Существует таблица подписки (включает в себя plan_id, адрес электронной почты, stripe_customer_token и два токена PayPal для клиента и повторяющегося профиля). На второй вопрос, я думаю, будет лучше, если пользователь сможет обновить/удалить подписку. Если присутствовал второй вариант, я не уверен в его структуре, когда у одного пользователя потенциально есть две подписки, перечисленные в базе данных. Поэтому я думаю, что самым безопасным путем было бы удалить/обновить. Вам нужно, чтобы я добавил исходный код? - person xps15z; 05.03.2014
comment
Все в порядке, я просто хотел убедиться, что не делаю предположений и не веду вас в неправильном направлении. Я обновил свой ответ. Это более полезно для вас или, по крайней мере, более применимо к вашей ситуации, если вы уже поняли это? - person WattsInABox; 06.03.2014
comment
Спасибо, удалось настроить. Сейчас начинаем создавать код, который позволит пользователю изменить свою подписку. Спасибо за содействие - person pwz2000; 06.03.2014