晚上看到一个 gem, bit_settings, 文件
核心代码:
def add_settings(settings:, column: :settings, prefix: nil)
prefix = prefix ? "#{prefix}_" : ''
if settings.size > 32
raise 'You can NOT have more than 32 settings (max unsigned int with 4 bytes is 2^32-1)'
else
settings.each_with_index do |setting, i|
define_method "#{prefix}#{setting}" do
self.send(column) & (1 << i) > 0
end
alias_method "#{prefix}#{setting}?", "#{prefix}#{setting}"
define_method "#{prefix}#{setting}=" do |value|
if ActiveModel::Type::Boolean.new.cast(value)
self.send("#{column}=", self.send(column) | (1 << i))
else
self.send("#{column}=", self.send(column) & ~(1 << i))
end
end
end
end
end
这个 gem 主要实现在一个字段存多个(最大 32 个)bool 型的属性。
这样做看起来很酷,想知道如果在现实的项目中这样用,有没有什么弊端?或者不方便的地方?
我能想到有一个场景不方便,比如按指定的多个属性做 group by 操作。