首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >有没有一种简单的方法可以将ActiveRecord对象转换为ActiveModel对象?

有没有一种简单的方法可以将ActiveRecord对象转换为ActiveModel对象?
EN

Stack Overflow用户
提问于 2020-07-28 14:51:20
回答 1查看 66关注 0票数 0

我一直在阅读有关存储库模式的文章:https://blog.spacesnottabs.io/2019/01/30/the-repository-pattern-for-ruby/,如果能够转换ActiveRecord对象并将其转换为ActiveModel对象,这样它就可以维护.attributes等方法及其验证,但会丢失调用数据库的所有方法(如.save.items ),那就太好了。

例如,考虑这个类:

代码语言:javascript
运行
复制
class TodoList < ActiveRecord::Base
  has_many :items

  validates :name, presence: true
end

我希望能够做到以下几点:

代码语言:javascript
运行
复制
> todoList = TodoList.first # first AR record from the database
> todoListModel = todoList.to_ar_model # converts from ActiveRecord to ActiveModel
> todoListModel.class
=> ActiveModel
> todoListModel.save
=> NoMethodError
> todoListModel.items
=> NoMethodError
> todoListModel.valid?
=> true

我知道to_model方法,但它不是我想要的:https://api.rubyonrails.org/classes/ActiveModel/Conversion.html#method-i-to_model

EN

Stack Overflow用户

发布于 2020-07-28 19:18:06

我不确定这是不是一个好主意,但我实现了它。

代码语言:javascript
运行
复制
class TodoListModel
  include ActiveModel::Model
  include ActiveModel::Attributes

  TodoList.columns_hash.each do |name, column|
    attribute(
      name,
      TodoList.connection.lookup_cast_type_from_column(column),
      default: column.default
    )
  end
end

todo_list = TodoList.first
model = TodoListModel.new(todo_list.attributes)

TodoListModel具有所有相同的列,具有正确的类型和默认值。默认情况下,它不会有相同的验证,您必须实现它们两次,或者在两者之间共享代码。

票数 1
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63128510

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档