【问题标题】:Rails Association logic on event and ticket事件和票证上的 Rails 关联逻辑
【发布时间】:2015-08-03 12:23:21
【问题描述】:

我正在使用 ruby​​ on rails 编写一个事件应用程序,但我一直在思考如何有效地进行关联:关联基于下表用户、事件、票证。我现在遇到的问题是门票和活动,它们是两种类型的门票:免费和付费,也有数量。

如果有人能在这个协会方面帮助我,我会很高兴。谢谢。

【问题讨论】:

    标签: database ruby-on-rails-4 activerecord associations


    【解决方案1】:

    关于票证类型,您应该查看STI

    先决条件:

    # Gemfile
    gem 'active_record_union'
    

    基本上是这样的:

    class Ticket
    end
    
    class FreeTicket < Ticket
      # Free-ticket stuff goes here
    end
    
    class PaidTicket < Ticket
      validates :price, presence: true # and other paid-related checks
    end
    

    我建议一些类似的东西用于关联:

    class Event # Also STI
    end
    class FreeEvent < Event
      has_many :free_tickets
      has_many :users, through: :free_tickets
    end
    class PaidEvent < Event
      has_many :paid_tickets
      has_many :users, through: :paid_tickets
    end
    class Ticket
      belongs_to :event
      belongs_to :user
      scope :open, -> { where(user_id: nil) }
      scope :taken, -> { where.not(user_id: nil) }
    end
    class User
      has_many :free_tickets
      has_many :paid_tickets
      has_many :free_events, through :free_tickets
      has_many :paid_events, through :paid_tickets
    
      def events
        free_events.union(paid_events)
      end
    end
    

    这样你可以做这样的事情:

    Event.find(1).tickets.count # => 13
    Event.find(1).tickets.open.count # => 10
    Event.find(1).tickets.taken.count # => 3
    Event.find(1).users.count # => 3
    User.find(1).events.count # => 1
    User.find(1).free_events.count # => 0
    User.find(1).paid_events.count # => 1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-27
      • 1970-01-01
      • 2020-08-19
      • 1970-01-01
      • 1970-01-01
      • 2015-07-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多