2014-08-27 74 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

您可以添加標籤上的型號以下列:

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

然後,您可以過濾這些TA gs基於這兩列:

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''的好處是什麼? – 2014-08-27 17:47:29

+0

@HommerSmith我覺得'server_exclusive'更明確,因爲一個標籤只適用於服務器,所以它不應該具有'is_for_server'(或其他名稱)值作爲true。所以'exclusive_'對我來說非常明確。它並沒有帶來任何好處,真正取決於你選擇列的名稱 – MrYoshiji 2014-08-27 17:52:15

0

您可以添加一列「TAG_TYPE」,而不是2列,並且有像「頁」,「服務器」,「全部」或類似的東西一個字符串,然後您可以通過該類型像

Tag.where(tag_type: "Page") 
輕鬆過濾

如果你是on Rails的4.1,你也可以用枚舉http://edgeapi.rubyonrails.org/classes/ActiveRecord/Enum.html

+0

你是正確的感謝,編輯。 – 2014-08-27 17:44:35