在数据库字段中存储来自预定义集的数组

时间:2016-04-12 09:48:47

标签: ruby-on-rails arrays ruby database activerecord

我有一个看起来像这样的模型

class Profile < ActiveRecord::Base
  ...
  serialize :languages_spoken, Array
  ...
end

对于应用程序的域,只关注用户是否使用预定义的English, Spanish, German, French or Italian

语言来说语言

目前我正在传递一个数组,该数组是从视图中的多选中选择的参数中最终序列化的。但是,我想用他们说的语言搜索用户,在序列化字段中搜索在ActiveRecord中非常笨拙。

我尝试通过联接表为语言创建一个具有多对多关系的不同模型,但我认为这对于这么小的功能来说太过分了。

我也想过使用 Postgres数组,虽然我不想依赖Postgres。

枚举字段会很棒,但它自然只适用于一个值。

这个问题有没有优雅而简单的解决方案?谢谢。

1 个答案:

答案 0 :(得分:0)

更新:我的不好,我忘记了问题的关键部分。它必须是一种多对多的关系。与enum你不能这样做。 Rails将值存储为DB中的整数。所以,它只存储一个值。

如果您愿意添加Postgres依赖项,则可以使用hstore类型。它也受到Rails 4的支持。

原始答案

如果您使用的是Rails 4.1或更高版本,则可以使用Active Record enums

class Profile < ActiveRecord::Base
  enum languages_spoken: [:english, :spanish, :german, :french, :italian]
end


profile.english? # => true/false
profile.languages_spoken  # => "english"

Profile.english # => Relation for all "english" profiles
Profile.languages_spoken # => { "English" => 0, "Spanish" => 1, "etc" => ... }