带有可以表示多种数据类型的列的 Rails 模型

Posted

技术标签:

【中文标题】带有可以表示多种数据类型的列的 Rails 模型【英文标题】:Rails model with column that can represent multiple datatypes 【发布时间】:2022-01-01 12:09:07 【问题描述】:

我很好奇是否可以在 rails postgresql 数据库中创建一个 type = text 的列,但是当调用该列时,将其中存储的任何内容转换为各种其他类型的数据(例如日期、整数等.)

就上下文而言,我正在创建一个工具,它允许创建一组问题并且许多用户可以回答这些问题。这些问题可以期待paragraphnumberdate 的回复。响应将存储在question_responses 表中。与其为各种响应类型(paragraphnumberdate)创建 3 列,我更愿意创建一个名为 response 的单个文本列。然后,将存储在response 中的任何内容转换为textintegerdate(根据需要)。想法?

这是我的模型:

# app/models/survey.rb
class Survey
  has_many :questions
end

# app/models/question.rb
class Questions
  belongs_to :survey
  has_many :responses
  enum response_type:  'Paragraph': 0, 'Number': 1, 'Date': 2 
end

# app/models/question_response.rb
# has column in db named "response" with type: text
class QuestionResponse
  belongs_to :user
  belongs_to :question

  def converted_response
    case question.response_type
    when 'Paragraph'
      response
    when 'Number'
      response.to_i
    when 'Date'
      response.to_date
    end
  end
end

# app/models/user.rb
class User
  has_many :responses
end

【问题讨论】:

当然你可以这样做——只需要小心地将数据保持在一个一致的问题中并优雅地处理失败的转换。 convert_response 中的 begin...rescue 块将是一个良好的开始,而测试覆盖率则是一个更好的结束。 你也可以使用 Rails 内置的 serialize 方法将类型存储为 YAML。 【参考方案1】:

是的,这可以做到。感谢@dbugger,重要的是还要记住验证存储在response 中的数据以及使用开始救援块来防止response 无法转换的情况。

【讨论】:

以上是关于带有可以表示多种数据类型的列的 Rails 模型的主要内容,如果未能解决你的问题,请参考以下文章

你如何更改rails中的列数据类型?

犰狳矩阵中的多种数据类型

Rails 中带有哈希列的数据库

Rails4:模型验证 slug 列的“格式”正则表达式

基于带有图标的列的 DataTables 搜索 [关闭]

Rails Arel 选择不同的列