Подскажите пожалуйста, как организовать следущее - есть кинотеарты и
есть фильмы, один фильм может идти в нескольких кинотеатрах, фильмы
могут иметь коментарии и отзывы .... Так же фильм имеет расписание и
такое свойство во сколько времени(+день, цена) он идет в кинотеарте.
Я сделал следущие модели:
class CinemaMovie < ActiveRecord::Base
belongs_to :cinema
belongs_to :movie
has_many :event_infos, :as => :eventable, :dependent => :destroy
named_scope :active_movies, :conditions => { :state =>
"active" }, :include => [:movie, :cinema, :event_infos]
named_scope :today, :conditions => [ "date
(`event_infos`.`event_date`) = date(?) and `event_infos`.`price` IS
NOT NULL", Time.now ], :joins => :event_infos
named_scope :by_cinema, lambda { |ciname_id| { :conditions =>
{ :cinema_id => ciname_id } } }
end
class Cinema < ActiveRecord::Base
has_many :cinema_movies
has_many :movies, :through => :cinema_movies, :order => 'name DESC'
end
class Movie < ActiveRecord::Base
has_many :cinema_movies
has_many :cinemas, :through => :cinema_movies
end
class EventInfo < ActiveRecord::Base
belongs_to :eventable, :polymorphic => true
end
Миграция:
create_table :cinemas do |t|
t.string :name
t.string :address
t.text :description
t.text :contact_information
t.timestamps
end
create_table :movies do |t|
t.string :name
t.string :style
t.integer :length
t.string :actors
t.string :movie_site
t.string :director
t.text :description
t.timestamps
end
create_table :cinema_movies do |t|
t.integer :cinema_id
t.integer :movie_id
t.string :state
t.date :start_date
t.date :end_date
end
create_table :event_infos do |t|
t.timestamp :event_time
t.date :event_date
t.float :price
t.integer :eventable_id
t.string :eventable_type
end
Основная идея:
cinema_movies - в том что тут хранится инфа когда начинается фильм и
когда заканчивается по дате, активен или не активен фильм
event_infos - в тому что тут будут хранится все похожие даные,
например если будет какой-то концерт, или выставка - даные (время,
цена ...) будут в модели EventInfo ..... а если говорить про
расписание - то их просто несколько.
Теперь задача показать на странице все фильмы в кинотеатре на сегодня
для определенного кинотеатра, но посортованого по дате, например
Терминатор 14-00
Робокоп 14-40
Терминатор 16-00
Хон Гиль Дон 16-10
.....
Сделал по следующему:
def cinema_events(cinema)
cinema_movies = CinemaMovie.by_cinema
(cinema.id).active_movies.today :include => :event_infos
processed = []
res = []
cinema_movies.each do |cinema_movie|
next if processed.include?(cinema_movie.id)
processed << cinema_movie.id
cinema_movie.event_infos.each do |event|
res << {:cinema_movie => cinema_movie, :event => event}
end
end
res = res.select {|x| !x[:event].price.nil? }.sort do |a, b|
a[:event].event_time <=> b[:event].event_time
end
res
end
но есть несколько моментов что мне не нравятся:
1) переменная res
2) больше всего переменна processed, она нужна потому как из-за метода
today я получаю несколько одинаковых записей CinemaMovie и мне надо
знать что я уже обработал а что еще нет
3) код я думаю можна зарефакторить, но я так и не понял как
4) кусок select {|x| !x[:event].price.nil? } я думаю можна уже
выкинуть потому как я это уже в scop-e today проверяю
Подскажите пожалуйста все ли правильно и best practices организации
моей задачи .... Спасибо!
On 24 Лют, 09:54, Julik Tarkhanov <julian.tarkha...@gmail.com> wrote:
> On Feb 24, 2009, at 8:29 AM, Igor K. wrote:
>
> > class CinemaMovie < ActiveRecord::Base
>
> class Theater < AR::Base
> has_many :screenings, :dependent => :destroy, :order => 'start_time
> ASC'
> has_many :movies, :through => :screenings
> end
>
> class Screening < AR::Base # start_time (Datetime), ticket_price,
> remaining_place_count
> belongs_to :movie
> belongs_to :theater
> end
>
> class Movie < AR::Base # duration_in_minutes, написан в
> прокатной карте ЛЮБОГО фильма
> end
>
Вобщем это все тоже самое что и у меня
> Фильм если и имеет расписание то
> только с применением контрацептивов.
>
Почему? Разве плохо вывести пользователю список фильмов на какой он
может пойти скажем через 2 часа? А не показывать ему в 6 часов вечера
то что было в 10 утра???
> > Теперь задача показать на странице
> > все фильмы в кинотеатре на сегодня
> > для определенного кинотеатра, но
> > посортованого по дате, например
>
> Сортовал - сортовал невысортовал. Как
> сделать скоуп от through не помню.
За :order => 'start_time спасибо, что-то из головы вылетело, но все
равно сортировка мне немного другая нужна
>
> > в тому что тут будут хранится все
> > похожие даные,
> > например если будет какой-то концерт,
> > или выставка - даные (время,
> > цена ...)
>
> в тому кому которому. Сделаешь STI от Movie
> и все дела.
посмотрим может и STI , а может еще что-то другое, так как у меня
EventInfo может хранить даные для чего угодно
>
> > t.float :price
>
> лучше сразу застрелись. Люди будут
> платить 67 рублей и 78.711211290909120000001
> копеек, Ножовку по металлу и
> размечатель копеек высылать по почте,
> лучше по электренной при помощи delayed job.
> Прайс чего? пачки попкорна? минета от
> билетерши? цены снятия фильма с показа?
>
Почему стрелятся? Я же сказал - что эта модель будет для чего угодно,
ладно кино там целые числа, а если будут не целые?
> t.integer :seat_price_in_cents
> t.integer :seats_available
> gem money
>
> > t.string :state
>
> какой state? Алабама? Росарио? NullPointerException?
Какая разница? Я вообще не понимаю зачем писать вот єти вещи "Алабама?
Росарио? NullPointerException?", я не думаю что это очень красиво.
Хотя если так интересно - то AASM, фильм могут запланировать и уже
внести даные о нем, о показе в кинотеатре и уж потом перевести его в
состояние active.
>
> > 2) больше всего переменна processed, она
> > нужна потому как из-за метода
> > today я получаю несколько одинаковых
> > записей CinemaMovie и мне надо
> > знать что я уже обработал а что еще нет
>
> переменна больше потому как я еще мне
> надо, но тем не менее для начала
> разберись со всем остальным.
>
> > res = res.select {|x| !x[:event].price.nil? }.sort do |a, b|
>
> то есть типа бесплатный показ фильма
> фтопку? молодежь скажет спасибо
>
Да безплатный
Я понимаю что опыта у меня меньше, но я стараюсь разобраться и вобщем
если чесно то я надеюсь еще увидеть другие советы, по поводу моей
задачи, надеюсь они будут более конструктивные и по теме.
Спасибо
> --
> Julik Tarkhanov
> m...@julik.nl
жостко, но надо дальше копать
On 24 Лют, 09:54, Julik Tarkhanov <julian.tarkha...@gmail.com> wrote:On Feb 24, 2009, at 8:29 AM, Igor K. wrote:class CinemaMovie < ActiveRecord::Base
Вобщем это все тоже самое что и у меня
Нет, не то же самое. Модель EventInfo тебе нафиг не нужна потому что это инфо уже описывает
Фильм если и имеет расписание тотолько с применением контрацептивов.
Почему? Разве плохо вывести пользователю список фильмов на какой он
может пойти скажем через 2 часа?
Теперь задача показать на страницевсе фильмы в кинотеатре на сегоднядля определенного кинотеатра, нопосортованого по дате, напримерСортовал - сортовал невысортовал. Каксделать скоуп от through не помню.
За :order => 'start_time спасибо, что-то из головы вылетело, но все
равно сортировка мне немного другая нужна
посмотрим может и STI , а может еще что-то другое, так как у меня
EventInfo может хранить даные для чего угодно
Почему стрелятся? Я же сказал - что эта модель будет для чего угодно,
ладно кино там целые числа, а если будут не целые?
t.integer :seat_price_in_centst.integer :seats_availablegem moneyt.string :stateкакой state? Алабама? Росарио? NullPointerException?
Какая разница? Я вообще не понимаю зачем писать вот єти вещи "Алабама?
Росарио? NullPointerException?", я не думаю что это очень красиво.
Я понимаю что опыта у меня меньше, но я стараюсь разобраться и вобщем
если чесно то я надеюсь еще увидеть другие советы, по поводу моей
задачи, надеюсь они будут более конструктивные и по теме.
Спасибо
Я не понял то место где про 3 screening и 15 моделей.
Попробую объяснить еще раз задачу:
Я хочу сделать получше, поуниверсальнее и что бы поменьше таблиц -
связки Кино,Кинотеарт,Показ(кино в кинотеатре),Расписание(или скажем
когда идет какой-то фильм в том или ином кинотеатре в определенный
день и время) и еще кучу разных сущностей вроде Концерт(он тоже
происходит где-то и когда-то), Выставка, Театр и тд. И поэтому я решил
что надо создать модель EventInfo где будет храниться информация о
расписании.
Как лучше организовать это? Что лучше сделать через STI а что через
polymorphic?
> Регистрация самого _факта_ того что
> кино идет в неком кинотеатре -
> малополезна за исключением спец случая
> "будет где-то через месяц".
Почему малополезна?
Я например если один и тот же фильм идет в 2х кинотеатрах выберу тот
какой мне больше понравиться или будет лучше обстановка.
> вообще надо сделать отдельную
> модельку (UpcomingShows).
Можно, а разве нельзя это все хранить там же? Просто выставить state
(AASN) например в upcomming? Ну или через STI.
> совершенно не плохо а даже очень
> хорошо, но расписание есть у показов
> фильма а не у самого
> фильма (разница ощущается?)
У меня так и есть, фильм не знает про показы, он знает только в каком
кинотеатре он идет и все.
А вот модель CinemaMovie уже знает про показы.
Вобщем я только разбираюсь и мне хочется знать как получше все
организовать.
Спасибо
end
class Event
belongs_to :theatre
belongs_to :title
property :performs_on, DateTime
property :ticket_cost_in_cents, Integer
property :active, Boolean
def self.today_events(date = Date.today)
all(:performs_on.gte => date, :performs_on.lt => date + 1, :order
=> [:performs_on])
end
end
class Theater
has_many :events
property :name, String
end
end
1. Что идет сегодня (сгруппированное по фильмам, потом по
кинотеатрам):
def today_movies
events = Event.today_events.inject({}) do |titles, event|
((titles[event.title] ||= {})[event.theater] ||= []) << event
titles
end
end
2. Что идет вообще в данном кинотеатре (сгруппировано по кино, потом
по дням):
class Theater
def movie_events
events(:order => [:performs_on]).inject({}) do |titles, event|
((titles[event.title] ||= {})[event.performs_on.to_date] ||= [])
<< event
titles
end
end
end
Можно добавить :active => true в условие выборки, где это необходимо.
Ну и другие ограничения as well.
(опять гмейл тупит, простите если письмо продублируется)
> Привет
>
> Подскажите пожалуйста, как
> организовать следущее - есть
> кинотеарты и
> есть фильмы, один фильм может идти в
> нескольких кинотеатрах, фильмы
> могут иметь коментарии и отзывы ....
> Так же фильм имеет расписание и
> такое свойство во сколько
> времени(+день, цена) он идет в
> кинотеарте.
module Movies
class Title
has_many :events
property :title, String
Игорь