Рельсы, где против присоединения против союза - PullRequest
0 голосов
/ 31 мая 2018

Возникли проблемы с поиском activerecord.Я думал, что правильно настроил свои модели, но я плохо справляюсь со своими объединениями (не уверен, что объединение или объединение - правильный путь? Это не должно быть так сложно).

У меня есть инструкции по созданию ставок в поездках с начальными датами.Я хочу создать список ставок, срок действия которых истек (т.е. дата начала уже в прошлом).Направляющие также могут иметь LosingBids, если ставка была отклонена

. В идеальном мире у меня был бы один набор результатов, который включает в себя как проигрышные, так и истекшие ставки для этого руководства, но я нахожу с 2 разными наборами результатов.К сожалению, я не могу заставить работать ни одну из «просроченных заявок».Результаты / ошибки в комментариях к коду.

class GuidesController < ApplicationController

  def expired_declined

    #this declined_bids call works
    @declined_bids = LosingBid.where("guide_id = ?", current_guide.id.to_s)

    #this expired_bids call returns Trips, not Bids
    @expired_bids = Bid.where("guide_id = ?", current_guide.id.to_s).expired

    #this expired_bids call gives me the following error:
    #SQLite3::SQLException: no such column: trips.start_date: SELECT  1 AS one FROM #”bids" WHERE (guide_id = '1') AND (trips.start_date < '2018-05-30') LIMIT ?
    @expired_bids = Bid.where("guide_id = ?", current_guide.id.to_s).where("trips.start_date < ?", Date.today)
  end
end

class Guide < ApplicationRecord
  has_many :bids
  has_many :losing_bids
end

class Trip < ApplicationRecord
  has_many :bids
end

class Bid < ApplicationRecord
  belongs_to :trip
  belongs_to :guide

  def self.expired
    Trip.where("start_date <= ?", Date.today) #.where("guide_id = ?", current_guide.id.to_s)
  end
end

class LosingBid < ApplicationRecord
  belongs_to :trip
  belongs_to :guide
end

Ответы [ 2 ]

0 голосов
/ 31 мая 2018

Я бы действительно спросил, нужна ли вам отдельная модель LosingBid или она просто создает дублирование и ненужную сложность.Вместо этого просто добавьте столбец enum к ставкам, который содержит статус:

class Bid
  enum status: [:pending, :declined, :expired, :accepted]
end

Это просто простой целочисленный столбец, который действует как битовая маска.

Это будетпросто позвольте сделать запрос по:

Bid.pending
Bid.expired
Bid.where(status: [:pending, :accepted])
Bid.where.not(status: :accepted)

Вы можете просто отклонить ставку: всякий раз, когда камень):

every 1.days do
  runner "BidExpiryService.perform"
end

# app/services/bid_expiry_service.rb
module BidExpiryService
  def self.perform
    bids = Bid.pending
              .joins(:trip)
              .where('trips.start_date <= ?', Date.current)
    bids.update_all(status: Bid.statuses[:expired])
    # @todo notify guides that bid has expired
  end
end
0 голосов
/ 31 мая 2018

Trip.where("start_date <= ?", Date.today).bids вернет вам истекшие ставки.

Вы должны переместить область expired в поездке, а не в заявке.

Если вы хотите область в заявкеВы можете определить.

class Bid
  scope :expired, -> { joins(:trip).where('trips.start_date <= ?', Date.current) }
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...