gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 07:52:40 24 4
gpt4 key购买 nike

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

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

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

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

这很简单。

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

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

有什么办法可以避免吗?

最佳答案

嗯,有可能 make the constructor private :

private_class_method :new

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


另一种方法是 Cart 不扩展 ActiveRecord::Base(我假设它扩展了),而是仅包含您需要的部分,例如ActiveRecord::持久性。如果您愿意深入研究,请查看 the source for ActiveRecord::Base 中包含的部分.


编辑:还有一个选择是将 Cart 本身设置为私有(private),只在一个只公开 CartFactory 的模块中。 “私有(private)类”没有内置语法,但是 it's possible to achieve since Ruby classes are just regular objects .同样,不知道 ActiveRecord 会如何处理这个问题。


但最后当然还有一个问题,即您是否想要这样做。一般来说,Ruby 不太擅长保护你免受自己的伤害。 :) 如后一个链接答案中所述,文档和信任大有帮助。

关于ruby-on-rails - Rails - 强制模型通过工厂方法创建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25074648/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com