【问题标题】:How can I display products that are booked in the future?如何显示未来预订的产品?
【发布时间】:2015-06-27 06:38:07
【问题描述】:

所以我有 3 个模型 - booking、marquee、businessuser。 Booking属于marquee,marquee属于businessuser,businessuser有很多marquee。

我正在尝试在我的应用程序助手中创建一个 find/where 子句,该子句将仅返回当前日期且属于预订的选取框(即预订有其 ID)。

我目前能够显示的是带有字幕的预订。但我希望它显示已预订的字幕。

这是我在应用程序助手中的方法

 def upcomingbookings
   @bookings = Booking.all
   @futuremarquees = Booking.where("marquee_id")
 end

booking 具有字段 :startdatetime 与 Date.today 的比较

只是为了澄清业务逻辑:Marquee 是人们可以为他们的聚会预订的帐篷。所以系统中有很多选框。当有人进行预订时,它会存储 marquee_id。 Booking 有自己的变量,例如 startdatetime 和 eventtype。我正在创建一个页面,当业务用户登录时,他们可以查看他们添加到系统中当前有预订的所有字幕

【问题讨论】:

  • 选框上的哪个字段有您要比较的日期?
  • @upcomingmarquees = Marquee.where("startdatetime > ? AND businessuser_id = ?", Date.today, session[:businessuser_id]) 。我知道这是不正确的,但它们仍然是正在使用的字段

标签: ruby-on-rails ruby sqlite activerecord


【解决方案1】:

你可以尝试做这样的事情

def upcomingbookings
 @futuremarquees = Marquee.where(['startdatetime > ?', DateTime.now] )
 # then you can do futuremarquees.marquee
end

【讨论】:

  • 但是@futuremarquees 只是返回当前日期之后创建的所有选取框,对吗?我要显示已预订的字幕,并且预订开始日期大于 Date.today。
  • @futuremarquees 应该返回所有叠加在未来开始的选取框,假设 startdatetime 在正确的位置
  • 我知道混乱在哪里。 startdatetime 是模型 Booking 的变量,不是 marquee
  • 字幕是电影吗?预订就像电影票,您希望获得所有售出的票,这些票将在未来兑换
  • 很抱歉给您带来了困惑。 Marquee 是人们可以为他们的聚会预订的帐篷。所以系统中有很多选框。当有人进行预订时,它会存储 marquee_id。 Booking 有自己的变量,例如 startdatetime 和 eventtype。我正在创建一个页面,当业务用户登录时,他们可以查看他们添加到系统中当前有预订的所有字幕。我希望这能消除一些困惑
【解决方案2】:
@futuremarquees = Booking.where(startdatetime: Date.today..Float::INFINITY, marquee_id: x)

【讨论】:

  • 这只是显示预订。我希望显示已预订且预订开始日期大于 Date.today 的选取框
  • 可能是这样的? Marquee.where.not('booking_id' => nil).joins(:booking).having('booking.startdatetime > ?', DateTime.now)
  • 是的,这似乎是在正确的轨道上,但是我收到了这个错误。错误的参数数量(0 代表 1)
  • 什么版本的 Rails?在 Rails 3 中,您可能需要执行类似 Marquee.where('booking_id IS NOT NULL').joins(:booking).having('booking.startdatetime > ?', DateTime.now) 的操作。
【解决方案3】:

假设一个名为 startdatetime 的日期字段,尝试:

@futuremarquees = Booking.where(['startdatetime > ?', DateTime.now])

【讨论】:

  • 这将返回在当前日期时间之后创建的所有预订。我想退回所有预订的开始日期时间大于 date.today 的字幕。
  • 这不可能真的发生:created_at 在我们在数据库中创建记录时被填充,因此created_at 永远不会大于当前日期时间
  • 当然,应该是startdatetime
【解决方案4】:

您可以执行以下操作:

# returns Marquee records having at least one booking in the future
marquees = Marquee.includes(:booking).where('bookings.startdatetime > ?', Date.today)

如果要查找未来属于特定BookingMarquee

marquees = Marquee.includes(:booking).where('bookings.startdatetime > ?', Date.today)
marquees = marquees.where(booking: { id: params[:booking_id] })

【讨论】:

  • 这似乎接近我所需要的。但是我得到了这个名为“booking”的错误关联,没有找到;也许你拼错了?
  • @FergusMorton 您是否在Marquee 模型中定义了has_one :booking 以反映belongs_to :marqueeBooking 模型?
  • 哇,我没有...非常感谢您的帮助。它现在运行良好。你为我节省了很多时间 Yoshi
  • 不客气 :) 不要忘记选择解决问题的答案。用 Rails 玩得开心!
  • Yoshi,最后一个问题。大帐篷可以在几个不同的日期预订(相同的大帐篷可以在六月预订,然后在七月等)。如果 Marquee1 被预订了 3 次,那么当我查看未来的预订时,它应该会显示 3 次。我该怎么做?
猜你喜欢
  • 2015-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-14
  • 1970-01-01
  • 1970-01-01
  • 2014-05-04
  • 1970-01-01
相关资源
最近更新 更多