【问题标题】:Many to many association through another association多对多关联通过另一个关联
【发布时间】:2018-10-19 19:03:48
【问题描述】:

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

一个场地可以有很多活动

一个事件可以有多种类型

一个活动有一个场地

一个流派可以有很多事件

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

所以我添加了一个 throught 关联和一个 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'

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

【问题讨论】:

  • 不,我会说这几乎是完美的方法:)

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


【解决方案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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-24
    • 1970-01-01
    • 2020-03-18
    相关资源
    最近更新 更多