通过另一个协会进行多对多协会

时间:2018-10-19 07:40:42

标签: ruby-on-rails ruby-on-rails-5

所以我有一个用于音乐活动的Rails应用程序。我有3个主要表格,场地,事件,流派

一个地点可以举办许多活动

一个活动可以有多种流派

一个活动有一个场地

一个流派可以举办许多活动

在事件部分中,显示类型是一个简单的查询,非常简单。 但是,在“场地”部分,我希望显示今晚发生的事件的类型。

所以我添加了一个虚拟关联和一个has_many

  has_many :genres, :through => :todays_events

  has_many :todays_events, -> {order(:start_time).where(start_time: Time.zone.now.beginning_of_day..Time.zone.now.end_of_day) }, class_name: 'Event'

这符合我的目的,但是我不相信这是一个最佳解决方案。有没有更好的最佳方法来达到相同的结果?

1 个答案:

答案 0 :(得分:1)

我更喜欢将“今天的事件”逻辑作为Event模型的一部分,因为我喜欢将我的代码隔离到我认为它们应该属于的位置,因此我将这样做:

class Event
  belongs_to :venue

  scope :today, -> {
    where(start_time: Time.zone.now.beginning_of_day..Time.zone.now.end_of_day).order(:start_time)
  }
end

class Venue
  has_many :events
end

rails控制台:

venue = Venue.first
events_today = Venue.first.events.today

# or when using as part of the query
available_venues = Venue.where(is_available: true)
available_venues_that_have_events_today = available_venues.joins(:events).where(events: { id: Event.today })

替代解决方案

class Event
  belongs_to event

  scope :today, -> {
    where(start_time: Time.zone.now.beginning_of_day..Time.zone.now.end_of_day)
  }
end

class Venue
  has_many :events
  has_many :events_today, -> { today }, class_name: Event.to_s
end

venue = Venue.first
events_today = Venue.first.events_today

# or when using as part of the query
available_venues = Venue.where(is_available: true)
available_venues_that_have_events_today = available_venues.joins(:events_today)