связи

0 просмотров
Перейти к первому непрочитанному сообщению

Igor K.

не прочитано,
24 февр. 2009 г., 02:29:5024.02.2009
– RubyOnRails to russian
Привет

Подскажите пожалуйста, как организовать следущее - есть кинотеарты и
есть фильмы, один фильм может идти в нескольких кинотеатрах, фильмы
могут иметь коментарии и отзывы .... Так же фильм имеет расписание и
такое свойство во сколько времени(+день, цена) он идет в кинотеарте.
Я сделал следущие модели:

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 организации
моей задачи .... Спасибо!

Julik Tarkhanov

не прочитано,
24 февр. 2009 г., 02:54:0124.02.2009
– ror...@googlegroups.com

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

Фильм если и имеет расписание то
только с применением контрацептивов.

> Теперь задача показать на странице
> все фильмы в кинотеатре на сегодня
> для определенного кинотеатра, но
> посортованого по дате, например

Сортовал - сортовал невысортовал. Как
сделать скоуп от through не помню.

> в тому что тут будут хранится все
> похожие даные,
> например если будет какой-то концерт,
> или выставка - даные (время,
> цена ...)

в тому кому которому. Сделаешь STI от Movie
и все дела.

> 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?

> 2) больше всего переменна processed, она
> нужна потому как из-за метода
> today я получаю несколько одинаковых
> записей CinemaMovie и мне надо
> знать что я уже обработал а что еще нет

переменна больше потому как я еще мне
надо, но тем не менее для начала
разберись со всем остальным.

> res = res.select {|x| !x[:event].price.nil? }.sort do |a, b|
то есть типа бесплатный показ фильма
фтопку? молодежь скажет спасибо


--
Julik Tarkhanov
m...@julik.nl





Igor K.

не прочитано,
24 февр. 2009 г., 03:36:0724.02.2009
– RubyOnRails to russian
жостко, но надо дальше копать

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

Julik Tarkhanov

не прочитано,
24 февр. 2009 г., 04:19:0024.02.2009
– ror...@googlegroups.com
On Feb 24, 2009, at 9:36 AM, Igor K. wrote:

жостко, но надо дальше копать
ой надо не то слово!



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 тебе нафиг не нужна потому что это инфо уже описывает
Screening. в крайнем случае (если тебя коробит что будет три screening с одинаковым описанием)
можно сделаь screening belongs_to :extended_description. То есть если тебе надо совет "как раскатать вместо трех
моделей пятнадцать" - мы можем, но заявляйте пожелания зала внятно в таком случае.
Регистрация самого _факта_ того что кино идет в неком кинотеатре - малополезна за исключением спец случая
"будет где-то через месяц". для которого вообще надо сделать отдельную модельку (UpcomingShows).

Еще я тебе ненавязчиво намекнул как называются вещи которые ты пытаешься назвать на языке который
ты пытаешься использовать.



Фильм если и имеет расписание то  
только с применением контрацептивов.


Почему? Разве плохо вывести пользователю список фильмов на какой он
может пойти скажем через 2 часа?
совершенно не плохо а даже очень хорошо, но расписание есть у показов фильма а не у самого
фильма (разница ощущается?)

Показать расписание на сегодня  - 
@theater.screenings.find(
:conditions => ["starts_at BETWEEN ? AND ?", Time.now + 1.hour, Time.now + 7.hours]
:include => :movie).map(&:movie)

без всяких зубодробтельных джойнов. Ну можно в скоп обернуть да.



Теперь задача показать на странице  
все фильмы в кинотеатре на сегодня
для определенного кинотеатра, но  
посортованого по дате, например

Сортовал - сортовал невысортовал. Как  
сделать скоуп от through не помню.

За :order => 'start_time  спасибо, что-то из головы вылетело, но все
равно сортировка мне немного другая нужна
извини не угадал :-)

посмотрим может и STI , а может еще что-то другое, так как у меня
EventInfo может хранить даные для чего угодно
Let's make one table "nodes", and make it store two fieds - the primary key and the phone number of
the guy who can describe it.

Как вариант:

class Event < AR::B; end
class Screening < Event; end


Почему стрелятся? Я же сказал - что эта модель будет для чего угодно,
ладно кино там целые числа, а если будут не целые?


t.integer :seat_price_in_cents
t.integer :seats_available
gem money

  t.string :state

какой state? Алабама? Росарио? NullPointerException?

Какая разница? Я вообще не понимаю зачем писать вот єти вещи "Алабама?
Росарио? NullPointerException?", я не думаю что это очень красиво.
Потому что ты пишешь "вот миграция", в ней присутствует пятьсот полей нерелевантных к
твоему вопросу, и называющихся., например. "иван_иваныч". Я тебе тонко намекаю что если ты описываешь некого ИванИваныча то неплохо бы
обьяснить кто он такой и зачем. Например так (это еще очень полезно для коллег)

  t.integer :penis_length # in inches, before the enlargment

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

Сейчас Олег тебе ответит по теме, только вот кофе с серной кислотой глотнет, перчиком чили
закусит - и ответит. Конструктивно.


Спасибо

Пжлст.
-- 
Julik Tarkhanov





Igor K.

не прочитано,
24 февр. 2009 г., 05:37:1424.02.2009
– RubyOnRails to russian
> > Вобщем это все тоже самое что и у меня
>
> Нет, не то же самое. Модель EventInfo тебе  
> нафиг не нужна потому что это инфо уже  
> описывает
> Screening. в крайнем случае (если тебя  
> коробит что будет три screening с  
> одинаковым описанием)
> можно сделаь screening belongs_to :extended_description.  
> То есть если тебе надо совет "как  
> раскатать вместо трех
> моделей пятнадцать" - мы можем, но  
> заявляйте пожелания зала внятно в  
> таком случае.

Я не понял то место где про 3 screening и 15 моделей.

Попробую объяснить еще раз задачу:
Я хочу сделать получше, поуниверсальнее и что бы поменьше таблиц -
связки Кино,Кинотеарт,Показ(кино в кинотеатре),Расписание(или скажем
когда идет какой-то фильм в том или ином кинотеатре в определенный
день и время) и еще кучу разных сущностей вроде Концерт(он тоже
происходит где-то и когда-то), Выставка, Театр и тд. И поэтому я решил
что надо создать модель EventInfo где будет храниться информация о
расписании.
Как лучше организовать это? Что лучше сделать через STI а что через
polymorphic?

> Регистрация самого _факта_ того что  
> кино идет в неком кинотеатре -  
> малополезна за исключением спец случая
> "будет где-то через месяц".

Почему малополезна?
Я например если один и тот же фильм идет в 2х кинотеатрах выберу тот
какой мне больше понравиться или будет лучше обстановка.

> вообще надо сделать отдельную  
> модельку (UpcomingShows).

Можно, а разве нельзя это все хранить там же? Просто выставить state
(AASN) например в upcomming? Ну или через STI.

> совершенно не плохо а даже очень  
> хорошо, но расписание есть у показов  
> фильма а не у самого
> фильма (разница ощущается?)

У меня так и есть, фильм не знает про показы, он знает только в каком
кинотеатре он идет и все.
А вот модель CinemaMovie уже знает про показы.

Вобщем я только разбираюсь и мне хочется знать как получше все
организовать.

Спасибо

Oleg Andreev

не прочитано,
24 февр. 2009 г., 08:13:4124.02.2009
– RubyOnRails to russian
module Movies
class Title
has_many :events
property :title, String # другие поля добавить по вкусу

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.


(опять гмейл тупит, простите если письмо продублируется)

Oleganza

не прочитано,
24 февр. 2009 г., 05:42:1224.02.2009
– ror...@googlegroups.com

On 24 févr. 09, at 08:29, Igor K. wrote:

> Привет
>
> Подскажите пожалуйста, как
> организовать следущее - есть
> кинотеарты и
> есть фильмы, один фильм может идти в
> нескольких кинотеатрах, фильмы
> могут иметь коментарии и отзывы ....
> Так же фильм имеет расписание и
> такое свойство во сколько
> времени(+день, цена) он идет в
> кинотеарте.

module Movies


class Title
has_many :events
property :title, String

Igor K.

не прочитано,
24 февр. 2009 г., 11:35:4224.02.2009
– RubyOnRails to russian
Спасибо за пример,
Я тоже только что шел домой и надумал выкинуть модель EventInfo и все
хранить в CinemaMovie(похоже на Event) таблице .... хотелось
поуниверсальнее, но лучше сделать покрасивее и понятнее.

Игорь

Ответить всем
Отправить сообщение автору
Переслать
0 новых сообщений