事件和票证上的 Rails 关联逻辑

Posted

技术标签:

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

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

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

【问题讨论】:

【参考方案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

【讨论】:

以上是关于事件和票证上的 Rails 关联逻辑的主要内容,如果未能解决你的问题,请参考以下文章

ruby on rails (模型关联查询)

将逻辑线程与事件调度线程分离

选择器上的 PHP 逻辑问题

将提交与票证追溯关联

为啥 Rails 应用程序没有拆分,业务逻辑没有转移到 gem 中? [关闭]

在 Rails 中为域逻辑使用回调的优缺点