Проверка перекрытия по времени на модели с полиморфными c ассоциациями с ruby на рельсах - PullRequest
0 голосов
/ 25 февраля 2020

Я пытаюсь создать проверку в модели (я думаю, что было бы лучше проверить ее на уровне базы данных на самом деле), чтобы пользователь не мог купить и товар, который уже купил в течение 2 дней (после 2 дни нормально, если он / она купит его снова).

У меня есть модель для действия "покупка", и с каждым действием покупки связан элемент, называемый "покупаемым". Кроме того, каждое действие по покупке связано с идентификатором пользователя.

Я пытаюсь сделать это в модели покупки (но моя проблема в том, что я не знаю, как правильно написать эту проверку или даже как получить «покупаемую» .id "или" user.id "при написании метода для проверки)

class Purchase < ApplicationRecord
  belongs_to :purchasable, polymorphic: true
  belongs_to :user

  validates :price, presence: true
  validate :no_purchase_overlap

  def no_purchase_overlap
    allPur = Purchase.includes(:purchasable).all
    if allPur.where("created_at >= ? AND user_id = ? AND purchase_id = ?", (Time.now-2.days), user_id, purchasable.id)
      errors.add(:date_end, 'it overlaps another purchase')
    end
  end
end

Покупка и ее приобретаемый вид выглядят так:

irb(main):006:0> Purchase.first
  Purchase Load (0.1ms)  SELECT "purchases".* FROM "purchases" ORDER BY "purchases"."id" ASC LIMIT ?  [["LIMIT", 1]]
=> #<Purchase id: 1, price: 0.299e1, quality: "SD", purchasable_type: "Season", purchasable_id: 9, user_id: 1, created_at: "2020-02-25 09:34:59", updated_at: "2020-02-25 09:34:59">
irb(main):007:0> Purchase.first.purchasable
  Purchase Load (0.1ms)  SELECT "purchases".* FROM "purchases" ORDER BY "purchases"."id" ASC LIMIT ?  [["LIMIT", 1]]
  Season Load (0.2ms)  SELECT "seasons".* FROM "seasons" WHERE "seasons"."id" = ? LIMIT ?  [["id", 9], ["LIMIT", 1]]
=> #<Season id: 9, title: "Brandy of the Damned", plot: "Here's looking at you, kid.", number: 1, created_at: "2020-02-25 09:34:17", updated_at: "2020-02-25 09:34:17">

В данный момент мои тесты не пройдены кажется, что он не позволяет сохранить какую-либо покупку:

it 'a movie can not be purchased by the same user more than once' do
  purchase = Purchase.new(price: 2.99, quality: 'HD', purchasable: movie, user: user)
  purchase_rep = Purchase.new(created_at: Time.now + 1.day ,price: 1.99, quality: 'SD', purchasable: movie, user: user)
  expect { purchase.save }.to change { user.purchases.count }.by(1)
  expect { purchase_rep.save }.to raise_error
end

сообщение об ошибке:

Сбои:

  1) Purchase When creating a purchase a movie can not be purchased by the same user more than once
     Failure/Error: expect { purchase.save }.to change { user.purchases.count }.by(1)
       expected `user.purchases.count` to have changed by 1, but was changed by 0
     # ./spec/models/purchase_spec.rb:14:in `block (3 levels) in <main>'

1 Ответ

0 голосов
/ 25 февраля 2020

Решено с

def no_purchase_overlap
    if Purchase.where("created_at >= ? AND user_id = ?", (Time.now-2.days), self.user.id).any?{|purchase| purchase.purchasable == self.purchasable}
      errors.add(:date_end, 'it overlaps another purchase')
    end
  end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...