0

db MovieShowingTicketおよびに 4 つのテーブルがありPurchaseます。Movie には多くShowingの があり、aShowingには多くTicketの があり、aPurchaseには多くTicketの があります。

Ticket内のすべての s がPurchase1 つだけになるように制約したいと思いMovieます。私はRailsが初めてで、モデルでこれを行う方法があるかどうか疑問に思いました. (validateまたは類似のもの)

4

2 に答える 2

1
class Purchase
  validate :validate_same_movie

  private

  def validate_same_movie
    movie_ids = tickets.map do |ticket|
      ticket.showing.movie.id
    end.uniq

    errors[:base] << "Can't have more than one movie in a purchase." if movie_ids.length > 1
  end
end

これらの線に沿った何か。

しかし、システムにこの複雑さを追加している理由を正確に考えることも強くお勧めします。私の経験では、通常、同じ映画の映画チケットを一度に購入しますが、1 回の購入で別の映画のチケットを購入したことは覚えていません。しかし、私がやったことがないからといって、誰もやらないわけではありません。複雑さが増し、サイトの機能が低下しています。あなたのアプリが何であるかわからないので、正当な理由がないと言っているのではありません..しかし、本当にこれが必要な場合に考えられる提案です.

于 2013-07-22T04:55:10.400 に答える
0

このようなものはどうですか?

class Purchase < ActiveRecord::Base
  has_one :movie
  has_many :tickets
end

class Ticket < ActiveRecord::Base
  has_one :purchase
end

class Movie < ActiveRecord::Base
  has_many :purchases
end
于 2013-07-22T02:09:32.843 に答える