Как мне создать и использовать соединительную таблицу в Rails? - PullRequest
1 голос
/ 21 марта 2010

У меня есть следующие данные:

  1. Пост под названием Hello имеет категории greet
  2. Еще одна запись под названием Hola имеет категории greet, international

Моя схема:

create_table "posts", :force => true do |t|
  t.string "name"
  t.datetime "created_at"
  t.datetime "updated_at"
end

create_table "categories", :force => true do |t|
  t.string   "name"
  t.datetime "created_at"
  t.datetime "updated_at"
end

create_table "posts_categories", :force => true do |t|
  t.integer  "post_id"
  t.integer  "category_id"
  t.datetime "created_at"
  t.datetime "updated_at"
end

После прочтения руководства по Rails наиболее подходящим соотношением для вышеупомянутого является:

class Post < ActiveRecord::Base
  has_and_belongs_to_many :categories
end

class Category < ActiveRecord::Base
  has_and_belongs_to_many :posts
end

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

  1. Какая команда начальной миграции для создания таблицы соединений в Rails?
  2. Каков наилучший способ действий, я должен удалить posts_categories и воссоздать его или просто удалить столбец первичного ключа?
  3. Есть ли у соединительной таблицы соответствующая модель? Я использовал scaffold для генерации кода соединительной таблицы. Должен ли я избавиться от лишнего кода?

Предполагая, что все вышеперечисленное исправлено и работает должным образом, как мне запросить все сообщения и отобразить их вместе с именованными категориями в представлении. Например:

Post #1 - hello, categories: greet
Post #2 - hola, categories: greet, international

1 Ответ

3 голосов
/ 21 марта 2010

Вы можете проверить эту веб-страницу из документации по rails API.

  1. самый простой способ создать соединительную таблицу - "script/generate model categories_posts category_id:integer post_id:integer". Обратите внимание, что имена классов должны быть в алфавитном порядке. Я довольно безразличен ко всему первичному ключу, но если это становится проблемой, вы можете сгенерировать миграцию для удаления, как 'script / generate DropPostsCategoriesIdFromPostsCategories posts_categories_id: integer' (убедитесь, что этот файл миграции делает то, что вы хотите, у меня нет ' t проверил это и то, что он делает, может варьироваться в зависимости от вашей версии rails), а затем выполните rake db:migrate. поменять БД.

  2. для имени класса, который вы используете, вы можете использовать:

class Post < ActiveRecord::Base
   has_many :categories, :through => :posts_categories
end

has_many through позволяет указывать имена таблицы соединений / соединений. или вы можете бросить стол и восстановить его с правильным именем.

  1. (должно быть # 3) да, просто сгенерируйте модель для класса соединения, не делайте всю эшафот. (см. выше)

чтобы найти все сообщения, сделайте что-то вроде @posts = Post.find(:all)

чтобы распечатать категории, сделайте что-то вроде

@posts.each do | post |
   print post.name, "\n"
   @posts.categories.each do | cat |
        print "\t", cat.name, "\n"
   end
end

в реальном коде rails, вы бы хотели сделать это в представлении, это больше похоже на консольный тип вывода.

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