2014-08-27 2 views
2

У меня есть таблица под названием Теги (которые теги, определенные мной), и эти слова могут быть применены к двум моделям: Page and ServerДифференцировать тег для двух моделей в Rails

Эти ассоциации:

page has_and_belongs_to_many tags 
server has_and_belongs_to_many tags 

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

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

Так я думал о решении это добавляет два столбца, который сказал бы:

is_for_page, is_for_server 

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

ответ

1

вы можете добавить следующие столбцы на модели Tag:

add_column :tags, :server_exclusive, :boolean 
add_column :tags, :page_exclusive, :boolean 

Тогда вы можете фильтровать эти TA г на основе этих двух столбцов:

class Tag < ActiveRecord::Base 
    scope :for_pages, -> { where('page_exclusive = :true OR (page_exclusive = :false AND server_exclusive = :false)', false: false, true: true) } 
    scope :for_servers, -> { where('server_exclusive = :true OR (page_exclusive = :false AND server_exclusive = :false)', false: false, true: true) } 
+0

Спасибо за ответ. Могу ли я спросить, в чем преимущество «' server_exclusive'' вместо того, чтобы делать '' is_for_server''? –

+0

@HommerSmith Я чувствовал, что «server_exclusive» был более явным, поскольку тег, который предназначен только для серверов, должен иметь этот тег не как «is_for_server» (или другое имя), а true. Поэтому 'exclusive_' был довольно явным для меня. Это не приносит никакого преимущества на самом деле, это действительно зависит от вас, чтобы выбрать имя столбцов – MrYoshiji

0

Вы можете добавить один столбец «tag_type» вместо 2-х столбцов и есть строка типа «Страница», «Сервер», «Все» или что-то подобное, а затем вы можете легко фильтровать по этому типу, как

Tag.where(tag_type: "Page") 

Если вы находитесь на Rails 4.1 вы можете также использовать перечисления http://edgeapi.rubyonrails.org/classes/ActiveRecord/Enum.html

+0

Вы правы, спасибо, отредактирован. –

Смежные вопросы