我一直在阅读有关存储库模式的文章:https://blog.spacesnottabs.io/2019/01/30/the-repository-pattern-for-ruby/,如果能够转换ActiveRecord对象并将其转换为ActiveModel对象,这样它就可以维护.attributes等方法及其验证,但会丢失调用数据库的所有方法(如.save或.items ),那就太好了。
例如,考虑这个类:
class TodoList < ActiveRecord::Base
has_many :items
validates :name, presence: true
end我希望能够做到以下几点:
> 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
发布于 2020-07-28 19:18:06
我不确定这是不是一个好主意,但我实现了它。
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具有所有相同的列,具有正确的类型和默认值。默认情况下,它不会有相同的验证,您必须实现它们两次,或者在两者之间共享代码。
https://stackoverflow.com/questions/63128510
复制相似问题