Ruby on rails Rails中两种型号的区分标记

Ruby on rails Rails中两种型号的区分标记,ruby-on-rails,Ruby On Rails,我有一个名为Tags的表(由我定义),这些标记可以应用于两种模型:Page和Server 这些是协会: page has_and_belongs_to_many tags server has_and_belongs_to_many tags 因此,用户可以使用预定义的标记标记页面和服务器 但是,其中一些标记可能只应用于服务器,因此每当我想显示可应用于页面的标记列表时,我都希望避免显示仅适用于服务器的标记列表 我想解决这个问题的方法是增加两列,即: is_for_page, is_for_se

我有一个名为Tags的表(由我定义),这些标记可以应用于两种模型:
Page和Server

这些是协会:

page has_and_belongs_to_many tags
server has_and_belongs_to_many tags
因此,用户可以使用预定义的标记标记页面和服务器

但是,其中一些标记可能只应用于服务器,因此每当我想显示可应用于页面的标记列表时,我都希望避免显示仅适用于服务器的标记列表

我想解决这个问题的方法是增加两列,即:

is_for_page, is_for_server
我希望避免使用两个表,一个用于服务器的标记,另一个用于页面的标记,因为它们大多数都是相同的。

您可以添加一列“tag_type”,而不是两列,并使用一个字符串,如“Page”、“Server”、“All”或类似的字符串,然后您可以轻松地按该类型进行筛选,如

Tag.where(tag_type: "Page")

如果您使用的是Rails 4.1,还可以使用Enum,您可以在标记模型上添加以下列:

add_column :tags, :server_exclusive, :boolean
add_column :tags, :page_exclusive, :boolean
然后,您可以根据以下两列筛选这些标记:

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) }
class标记{where('page_exclusive=:true或(page_exclusive=:false和server_exclusive=:false)},false:false,true:true)}
作用域:对于_服务器,->{where('server_exclusive=:true或(page_exclusive=:false和server_exclusive=:false)},false:false,true:true)}

谢谢你的回答。请允许我问一下,使用
server\u exclusive
而不是使用
is\u for\u server
有什么好处?@HommerSmith我觉得“server\u exclusive”更为明确,因为标签只针对服务器,所以该标签不应具有“is\u for\u server”(或其他名称)值。所以,
exclusive
对我来说非常明确。它并没有带来任何好处,真正的优势在于您选择列的名称