Rails - 通过工厂方法创建强制模型

时间:2014-08-01 07:02:17

标签: ruby-on-rails ruby ruby-on-rails-4 factory-pattern

我正在使用Rails 4.我有一个类Cart,需要在我的应用程序中访问。

我希望使用工厂模式访问它:

class CartFactory
  def self.obtain_cart_for_user(user)
    ...
  end
end

我需要这种方法,因为有时,我想要返回一个现有的购物车,有时会创建一个新的购物车(根据购物车的年龄,其内容,其中的产品是否仍然可用等)。

这很容易。

但是,我还想确保其他未来的程序员不直接实例化购物车,或通过任何其他方式获取购物车,包括通过模型关联,例如:

Cart.new(...)
user.carts.new(...)
Cart.find(id)
Cart.find_by_attribute(blah: blah)
Cart.where(...).first

有没有办法阻止它?

1 个答案:

答案 0 :(得分:5)

嗯,可以make the constructor private

private_class_method :new

当然,您也可以尝试将ActiveRecord查询方法(.find.where等)设为私有。但对我来说,这听起来像是一种结束不稳定行为的好方法。如果你要走这条路,请确保你的应用程序先经过全面测试。


另一条路线是Cart不延伸ActiveRecord::Base(我假设它),而只包括您需要的部分,例如ActiveRecord::Persistence。如果您愿意深入了解,请查看the source for ActiveRecord::Base中包含的部分。


编辑:还有一个选项是让Cart本身在仅公开CartFactory的模块中保密。对于"私有类"没有内置语法,但是it's possible to achieve since Ruby classes are just regular objects。再一次,不知道ActiveRecord会如何处理它。


但最后有一个问题是你是否想要这样做。一般来说,Ruby并不擅长保护自己。 :)正如后面的链接答案,文档和信任所表达的那样。