Создание связанных таблиц
Oct. 8th, 2014 10:03 pmhttp://asci.blog.ru/121082819.html?attempt=1
Связанные таблицы на примере тегов
Изучая пока что основы rails 3 я столкнулся с вопросом реализации тегов. Более фундаментально он звучал для меня так:
Как делать связанные таблицы многие к многим.
Итак. Пускай будут две модели post и tag которые мы или сгенерировали скаффолдом.
rails g scaffold post title:string content:text
rails g scaffold tag value:string
И пока не делаем миграцию.
Соответственно у постов могут быть теги, однако мы так же хотим получать через теги посты которые их имеют. Вот к чему надо привести модели постов и тегов:
class Post < ActiveRecord::Base
has_and_belongs_to_many :tags
end
class Tag < ActiveRecord::Base
has_and_belongs_to_many :posts
end
Затем надо создать связывающую таблицу. Для этого надо сгенерировать миграцию такого вида:
rails g migration posts_tags
Это создаст валидную пустую миграцию. По умолчанию rails будет искать связи именно в этой таблице, причем последовательность названия полей должна быть по алфавиту.
После создания файла миграции, его нужно немного подправить, а именно привести миграцию к такому виду:
class PostsTags < ActiveRecord::Migration
def self.up
create_table :posts_tags, :id= >false do |t|
t.integer :post_id
t.integer :tag_id
end
end
def self.down
drop_table :posts_tags
end
end
После этого запускаем миграцию командой
rake db:migrate
Теперь мы можем обращаться двусторонне как post.tags так и tag.posts. Однако, при создании новых тегов для поста они заново создаются и в таблице tags, что нам категорически не нужно. Для того, что бы исправить это, при создании тега проверяем, есть ли он уже в базе при помощи
Tag.where(«value = ?», tag)
и если есть, то добавляем найденный тег к тегам поста, в другом случае создаем тег
Связанные таблицы на примере тегов
Изучая пока что основы rails 3 я столкнулся с вопросом реализации тегов. Более фундаментально он звучал для меня так:
Как делать связанные таблицы многие к многим.
Итак. Пускай будут две модели post и tag которые мы или сгенерировали скаффолдом.
rails g scaffold post title:string content:text
rails g scaffold tag value:string
И пока не делаем миграцию.
Соответственно у постов могут быть теги, однако мы так же хотим получать через теги посты которые их имеют. Вот к чему надо привести модели постов и тегов:
class Post < ActiveRecord::Base
has_and_belongs_to_many :tags
end
class Tag < ActiveRecord::Base
has_and_belongs_to_many :posts
end
Затем надо создать связывающую таблицу. Для этого надо сгенерировать миграцию такого вида:
rails g migration posts_tags
Это создаст валидную пустую миграцию. По умолчанию rails будет искать связи именно в этой таблице, причем последовательность названия полей должна быть по алфавиту.
После создания файла миграции, его нужно немного подправить, а именно привести миграцию к такому виду:
class PostsTags < ActiveRecord::Migration
def self.up
create_table :posts_tags, :id= >false do |t|
t.integer :post_id
t.integer :tag_id
end
end
def self.down
drop_table :posts_tags
end
end
После этого запускаем миграцию командой
rake db:migrate
Теперь мы можем обращаться двусторонне как post.tags так и tag.posts. Однако, при создании новых тегов для поста они заново создаются и в таблице tags, что нам категорически не нужно. Для того, что бы исправить это, при создании тега проверяем, есть ли он уже в базе при помощи
Tag.where(«value = ?», tag)
и если есть, то добавляем найденный тег к тегам поста, в другом случае создаем тег