我有一个模型Photo
,它有两个选项is_photo
或is_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
并填写所有字段,则会保存所有字段。
如何成功重置其他选项的字段?
答案 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
更多信息:
答案 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
这假设事物可以同时是艺术和照片。如果情况并非如此,那么您不需要一系列独立的布尔值,您需要一个类别字段。