Ruby on rails 如何在ActiveRecord中分离持久性?

Ruby on rails 如何在ActiveRecord中分离持久性?,ruby-on-rails,persistence,abstraction,rails-activerecord,Ruby On Rails,Persistence,Abstraction,Rails Activerecord,我目前正在用Ruby(而不是Rails)构建一个应用程序,它使用ActiveRecord作为ORM,使用sqlite作为数据库 一个示例代码,只是为了澄清我的问题: class User < ActiveRecord::Base has_many :logins, :foreign_key => :user_id has_many :categories, :foreign_key => :user_id has_many :news, :foreign_key =

我目前正在用Ruby(而不是Rails)构建一个应用程序,它使用ActiveRecord作为ORM,使用sqlite作为数据库

一个示例代码,只是为了澄清我的问题:

class User < ActiveRecord::Base
  has_many :logins, :foreign_key => :user_id
  has_many :categories, :foreign_key => :user_id
  has_many :news, :foreign_key => :user_id
  has_many :settings, :foreign_key => :user_id

  class << self
    def get_user_by_id(id)
      find(id)
    end

    def insert(username, password)
      create(:username => username, :password => password)
    end
  end
end
class用户:用户\u id
有多个:类别,:外部\u键=>:用户\u id
有很多:新闻,:外键=>:user\u id
有多个:设置,:外键=>:用户\u id
类用户名:password=>password)
结束
结束
结束

代码(关系、模型等)目前一点也不复杂。然而,当我的模型开始变大时,我不想在同一个类中混合业务逻辑和持久性逻辑。我希望能够更改我的持久性方法(文件、内存、其他数据库orm)。有没有一个既定的方法可以做到这一点?我读到在Rails中,“瘦控制器,胖模型”很常见,但我正在寻找一种解决方法。

不幸的是,ActiveRecord模式可能不是适合您的最佳解决方案。说:

对象同时携带数据和行为。这些数据中有很多是真实的 持久的,需要存储在数据库中。活动记录使用 最明显的方法是将数据访问逻辑放入域中 对象这样,所有人都知道如何将数据读写到 从数据库中

也许您需要研究数据映射器模式(和),它是专门为分离业务逻辑和持久性而设计的

也就是说,如果你真的必须使用ActiveRecord,我会加入一些组合,比如:

class UserRepository < ActiveRecord::Base
  # all the persistence stuff goes in here
end

class User
  def initialize(login, repository=UserRepository)
    @repository = repository
    @user = @repository.find_by_login(login)
  end

  def instanography
    #complicated business logic
  end

  def method_missing(m, *args, &block)
    @user.send(m, *args, &block)
  end
end
class UserRepository

如上面的示例所示,我会让用户对象充当真实活动记录对象的代理,保留所有业务逻辑并隐藏持久性内容。

使用Rails并让它为您完成所有这些工作怎么样?更准确地说,似乎Rails-3的新概念正适合它:ORM抽象。因为我正在构建一个非Rails应用程序,我只想使用ActiveRecord。