Правильная структура данных модели? (My 1st Rails App) - PullRequest
1 голос
/ 13 января 2009

Я собираюсь создать свое первое приложение Ruby on Rails (и сначала что-нибудь кроме xhtml и css), и я ищу некоторые полезные отзывы о структуре моей модели.

Я включил макет, чтобы помочь визуализировать приложение.

Единственные модели, которые, я уверен, мне нужны, пока:
1. фильм модель (в качестве основной модели, названный фильм, чтобы URL-адреса выглядели так: "sitename.com/movies/1-Willy-Wonka") и
2. a пользователь модель

Кроме тех, я не знаю, что делать другим; например, «места съемок», «актеры» и, что наиболее важно, такие атрибуты, как «Вилли Вонка» и «Джонни Депп».

Должен ли я сделать все эти модели, даже атрибуты? Если да, то возможно ли и рекомендуется ли людям создавать модели в качестве атрибутов?

Я пытаюсь увидеть приложение как данные, созданные формами и хранящиеся в базах данных, и с помощью этого pov я не могу решить, как связать атрибуты (персонаж <=> актер) с разделами (актеры, места съемок, художественные работы и т. Д. .) внутри списка фильмов; позволяя самим атрибутам быть гиперссылками на связанные атрибуты / фильмы / даже разделы: при нажатии на «steven speilberg» вы попадете на страницу с фильмами, в которых он снимался, фильмами, в которых он снялся, снят, снят и т. д.

Мысли

Ответы [ 6 ]

2 голосов
/ 14 января 2009

Возможно, стоит почитать о нормализации базы данных: http://en.wikipedia.org/wiki/Database_normalization

2 голосов
/ 13 января 2009

Дальнейшая разработка. Миграции для перечисленных выше моделей могут выглядеть следующим образом:

class CreateMovies < ActiveRecord::Migration
  def self.up
    create_table 'movies' do |t|
      t.string  'title', :null => false
      t.timestamps
    end
  end

  def self.down
    drop_table 'movies' 
  end
end

class CreateActors < ActiveRecord::Migration
  def self.up
    create_table 'actors' do |t|
      t.string  'first_name', 'last_name', :null => false
      t.timestamps
    end
  end

  def self.down
    drop_table 'actors' 
  end
end

Поля movie_id и actor_id ниже соответствуют belongs_to ассоциациям в модели ролей выше и являются внешними ключами, которые позволяют таблице ролей объединять актеров и фильмы. Как я и предлагал моделировать, character_name является свойством этого отношения и, следовательно, атрибутом роли. Это ваш вызов, разрешите ли вы NULL в имя_символа. Я с подозрением отношусь к NULL, но в этом случае я позволил это, поскольку можно привести аргумент, что на практике вы часто хотите сохранить факт, что актер снимается в данном фильме, но не знает или не заботится о персонаже. имя.

class CreateRoles < ActiveRecord::Migration
  def self.up
    create_table 'roles' do |t|
      t.integer 'movie_id', 'actor_id', :null => false
      t.string 'character_name'
      t.timestamps
    end
  end

  def self.down
    drop_table 'roles' 
  end
end
2 голосов
/ 13 января 2009

Если это ваше первое что-либо в отношении веб-разработки, то я предлагаю вам начать с написания простого веб-приложения, которое просто перечисляет фильмы и позволяет добавлять, редактировать и удалять их. Просто сохраните заголовок, краткий обзор и, возможно, URL постера фильма / обложки DVD. Затем работайте над добавлением актеров и связыванием их с фильмом.

Создание сайта, подобного IMDB, не является тривиальным проектом. У вас будет много сложных отношений, помимо простой привязки актера к фильму. Актеры имеют роли в кино. И вы можете захотеть стать еще более абстрактным и сказать, что у человека есть работа в фильме, которая позволит вам также отслеживать такие вещи, как режиссеры, продюсеры, ключевые захваты, режиссеры.

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

2 голосов
/ 13 января 2009

Начните с моделей Movie, Actor, FilmLocation и Character. У Кино и Актера есть отношения многие ко многим (У Кино есть много актеров, актер работал над многими фильмами). FileLocation и Movie также многие-ко-многим. Персонаж (Вилли Вонка) и Актер также многие-ко-многим.

2 голосов
/ 13 января 2009

Я бы рекомендовал сначала прояснить вашу модель данных. Затем вы можете начать с одной модели рельсов на таблицу базы данных. Это не всегда так, но это разумное место для начала.

Давайте сосредоточимся на фильмах и актерах:

Некоторые предположения:

  • фильмы могут иметь отношение многих ко многим другим сущностям
  • вы хотите сохранить информацию о персонаже как часть отношений между актером и фильмом

Затем вы можете смоделировать ваши отношения следующим образом:

# movies.rb
class Movie < ActiveRecord::Base
  has_many :roles
  has_many :actors, :through => :roles
end

# actor.rb
class Actor < ActiveRecord::Base
  has_many :roles
  has_many :movies, :through => :roles
end

Обычно вы можете положиться на магию Rails, чтобы управлять моделью соединения, не создавая ее самостоятельно. В этом случае мы хотим сохранить информацию о символах в качестве атрибутов модели соединения, поэтому мы создаем ее явно.

# role.rb
class Role < ActiveRecord::Base
  belongs_to :movie
  belongs_to :actor
end
1 голос
/ 13 января 2009

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

Полезно иметь твердое представление о ассоциациях ActiveRecord перед написанием сложного приложения. Убедитесь, что вы знаете все ассоциации наизусть и что они на самом деле генерируют в терминах таблиц SQL. Иногда это может показаться магией, а магия не обязательно хорошая вещь. Если вы знаете, что за этим стоит, все встает на свои места.

Кроме того, не бойтесь отбросить все и начать все сначала, экспериментируя. Это Руби, так что вам не понадобится много времени, чтобы вернуться туда, где вы были.

...