Рубин на рельсах ассоциации новичка - PullRequest
0 голосов
/ 12 февраля 2012

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

`CREATE TABLE "pages" (
   "id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
   "title" varchar(255),
   "body" varchar(255),
   "author" varchar(255), 
   "email" varchar(255), 
   "reference" varchar(255),
   "created_at" datetime,
   "updated_at" datetime);`

Мне предложили создать отдельные таблицы для автора, и это то, что я пытался ииспортилМожет кто-нибудь сказать мне, как именно ассоциации должны работать с моим сценарием?Мне действительно нужно хорошо понимать ассоциации ROR.

edit-1

Вот код миграции моих страниц:

class CreatePages < ActiveRecord::Migration
  def self.up
    create_table :pages do |t|
      t.string :title, :unique => true, :limit => 50
      t.string :body, :limit =>255
      t.string :email, :unique => true, :limit => 50
      t.string :reference, :limit => 40
      t.timestamps
    end

  end

  def self.down
    drop_table :pages
  end
end

и вот миграции моих авторов:

class CreateAuthors < ActiveRecord::Migration
  def change
    create_table :authors do |t|
      t.string :author, :unique => true, :null => false, :limit => 50
      t.timestamps
    end
  end
end

Ответы [ 2 ]

1 голос
/ 12 февраля 2012

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

@ Марк Талбот уже дал хороший ответ о том, как установить ассоциации в ваших моделях Rails. Конечно, вам также нужно будет перенести вашу базу данных. Вот что нужно сделать:

  1. Составьте таблицу под названием «авторы». Помимо первичного ключа «id», он должен иметь поле с именем «name», а также «email». Вы можете переместить любые другие поля, которые по логике всегда будут одинаковыми для одного и того же автора, из "страниц" в "авторов".
  2. Добавьте целочисленное поле "author_id" к "pages".
  3. Запустить существующие записи в «страницах». Для каждой страницы проверьте, есть ли автор уже в «Авторы». Если нет, добавьте автора в «авторы» и заполните «имя», «электронная почта» и другие поля в «авторы». Установите «author_id» для ссылки на правильный идентификатор из таблицы авторов.
  4. Удалите слова "author", "email" и другие перемещенные поля из "страниц".
1 голос
/ 12 февраля 2012

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

class Author < ActiveRecord::Base
  has_many :pages

class Page < ActiveRecord::Base
  belongs_to :author

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

my_page.author.email
my_page.author.name

(при условии, что ваш класс Author имеет такие атрибуты)

Обратите внимание, что вам необязательно иметь класс Author, если вашПользователи ваши авторы.Если каждый Автор является Пользователем (и вы используете свой класс User для аутентификации и обслуживания учетной записи), вы все равно можете ссылаться на Пользователя как на Автора класса

class Page < ActiveRecord::Base
  belongs_to :author, :class_name => "User"

, что позволяет вам сохранить семантику хорошего автораby делает их для вашего класса User.

Последнее замечание: если вы хотите автоматически удалять любые страницы, связанные с автором, при удалении объекта автора, вы можете добавить зависимость к классу Author

class Author < ActiveRecord::Base
  has_many :pages, :dependent => :destroy
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...