scaly_toad: (Default)
[personal profile] scaly_toad
http://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)
и если есть, то добавляем найденный тег к тегам поста, в другом случае создаем тег

This account has disabled anonymous posting.
If you don't have an account you can create one now.
HTML doesn't work in the subject.
More info about formatting

Profile

scaly_toad: (Default)
scaly_toad

April 2026

S M T W T F S
   1 234
567 8 9 1011
1213141516 1718
19202122232425
2627282930  

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Apr. 18th, 2026 11:42 am
Powered by Dreamwidth Studios