事件和票证上的 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 关联逻辑的主要内容,如果未能解决你的问题,请参考以下文章