根据boolean,Rails使字符串为空

时间:2018-02-01 16:33:53

标签: ruby-on-rails ruby

我有一个模型Photo,它有两个选项is_photois_art,每个选项都有各自独立的字段。

但是,当选择一个选项时,我希望将其他选项的字段重置为空字符串。

这就是我所拥有的:

photo.rb

before_save :reset_photo_options
before_save :reset_art_options

def reset_photo_options
  if self.is_art == 1
    self.resolution = ""
    self.camera = ""
  end
end

def reset_art_options
  if self.is_photo == 1
    self.tool = ""
    self.medium = ""
  end
end

但是,如果我填写is_photo字段,然后更改为is_art并填写所有字段,则会保存所有字段。

如何成功重置其他选项的字段?

2 个答案:

答案 0 :(得分:1)

当处理这样的互斥选项时,我总是创建一个具有该类型的单个字段。使用" enums"你可以这样做:

class Photo
  enum photo_style: [ :art, :photo ]
end

这使您能够使用类似的方法:

photo.art?

你会使用直线布尔值。

您也可以在查询中使用它们:

Photo.where(photo_style: :photo)

对于您的具体问题,您可以将逻辑转换为单个回调:

before_save :reset_options

def reset_options
  if art?
    # do something
  elsif photo?
    # do something else
  end
end

更多信息:

http://api.rubyonrails.org/classes/ActiveRecord/Enum.html

答案 1 :(得分:0)

如果这些是适当的布尔列,至少就ActiveRecord而言,那么你应该能够通过使用返回严格?或{{1的true方法变量来做到这一点。值:

false

设置为def reset_photo_options return unless self.is_art? self.resolution = nil self.camera = nil end def reset_art_options return unless self.is_photo? self.tool = nil self.medium = nil end 通常比空字符串更好,因为NULL列是一个清晰的通信器,该字段不相关且未设置。空字符串可能表示缺少数据或没有捕获用户输入。

对此的进一步重构是描述哪些字段采用何种类型:

nil

这假设事物可以同时是艺术和照片。如果情况并非如此,那么您不需要一系列独立的布尔值,您需要一个类别字段。