Могу ли я определить запрос в модели Rails? - PullRequest
3 голосов
/ 22 октября 2011

Вот что у меня есть:

module EventDependencyProperties
  def start_date
    shows.order('show_date ASC').first.show_date
  end

  def end_date
    shows.order('show_date DESC').first.show_date
  end

  def is_future_show?
    end_date >= Date.today 
  end
end

class Event < ActiveRecord::Base
  include EventDependencyProperties
  has_many :shows
  has_and_belongs_to_many :users
end

class Show < ActiveRecord::Base
  belongs_to :event
end

У меня есть биты кода в другом месте с использованием метода is_future_show?.То, что я хотел бы сделать, - это иметь метод в модуле mixin, чтобы возвращать «будущие шоу», используя запрос, который имеет те же критерии, что и метод is_future_show?.Как бы я пошел для достижения этого?Я очень новичок в Rails, но заражен знанием других языков и фреймворков.

Приветствия, Дэни.

1 Ответ

2 голосов
/ 22 октября 2011

Вы можете поместить запрос в область действия :

class Show < ActiveRecord::Base
  scope :future, lambda { where("show_date > ?", Date.today) }
end

Назовите его так:

my_event.shows.future

Редактировать : А-аПонимаю.Чтобы вернуть все события с показом в будущем:

Event.joins(:shows).where("shows.show_date > ?", Date.today)

, это можно ограничить областью действия:

class Event
  scope :future, lambda { joins(:shows).where("shows.show_date > ?", Date.today) }
end

С другой стороны, я не уверен в настройке вашегомодели, особенно использование mixin.Вот что я делаю:

class Show < ActiveRecord::Base
  belongs_to :event

  # use default_scope so shows are ordered by date by default
  default_scope order("show_date ASC")
end

class Event < ActiveRecord::Base
  has_many :shows
  has_and_belongs_to_many :users

  scope :future, lambda { joins(:shows).where("shows.show_date > ?", Date.today) }

  def start_date
    shows.first.show_date
  end

  def end_date
    shows.last.show_date
  end

  def ends_in_future?
    end_date > Date.today
  end
end

также было бы чище, если бы столбец show_date для модели Show был просто назван date (так что вы могли бы просто написать show.date вместо show.show_date),

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...