“set”和Rails的列类型

时间:2010-01-12 18:15:00

标签: mysql ruby-on-rails ruby-on-rails-plugins ddl

我正在建立一个在线优惠数据库。每个优惠都可以在一个或多个国家/地区查看,例如广告客户可能有兴趣在美国和美国推出优惠。加拿大。

我们所覆盖的国家/地区列表长度约为50个,每个国家/地区都标有ISO标准两个字母的首字母缩写词,如美国,加拿大,英国,法国,德国等。

我可以使用HABTM表来处理这个问题,但是如果我可以简单地使用MySQL中的“SET”列类型,那么将长表连接到各个国家/地区似乎效率低下。 Postgres(参见关于'SET TYPE'here的MySQL文档)。

我确实尝试添加“set”类型的列,如下所示:

  t.set :regions, :limit => ["GB","FR","DE"]

这不会引发错误但是现在我的对象中缺少字段'regions'。我在Google上找不到太多,因为“set”这个词是英语中最常用的词汇(140多个不同的用法和6个字典)。唯一相关的文章是关于2006年的Rails Wiki,现在是404-ing。

会欣赏任何指示,并在此期间实施habtm。

1 个答案:

答案 0 :(得分:1)

我最终覆盖了模型中的默认访问器方法,如下所示:

def regions=(list)
  write_attribute(:regions, pack(list))
end

def regions
  read_attribute(:regions).split("::")
end

private
def pack(var)
  field = var[0]
  list = var.dup
  list.shift
  list.each do |i|
    field = [field,i].join("::")
  end
  field
end

我将'regions'字段设置为'text'。此代码将“::”作为分隔符存储在列表中。