gpt4 book ai didi

ruby-on-rails - Rails 命名空间类与现有的 active_record 模型相同

转载 作者:行者123 更新时间:2023-12-04 17:02:36 26 4
gpt4 key购买 nike

我在使用 Rails 4 中的命名空间时遇到了一些麻烦。

我有 ActiveRecord 模型 Shop , Order , 和 OrderItem

# model/shop.rb
class Shop < ActiveRecord::Base

# model/order.rb
class Order < ActiveRecord::Base
has_many :order_items

# model/order_item.rb
class OrderItem < ActiveRecord::Base
belongs_to :orderable, polymorphic: true
belongs_to :order

我正在复制 Order 之间的关系和 OrderItem在这样的命名空间中
# model/shop/order.rb
class Shop::Order
attr_accessor :order_items
def initialize
self.order_items = []
self.order_items << Shop::OrderItem.new
end

# model/shop/order_item.rb
class Shop::OrderItem
attr_accessor :orderable_type, :orderable_id

def initialize(params = {})
if params
self.orderable_type = params['orderable_type'] if params['orderable_type']
self.orderable_id = params['orderable_id'] if params['orderable_id']
end
end

def price
orderable.price
end

def orderable
orderable_type.constantize.find_by(id: orderable_id)
end

def to_h
Hash[
orderable_type: self.orderable_type,
orderable_id: self.orderable_id,
price: self.price
]
end

end

所以我的问题是,当我初始化 Shop::Order.new ,有时是 order_itemsOrderItem 的数组s 而不是 Shop::OrderItem s,当我在 Controller 中测试时,如果我输入 Shop::OrderItem ,它将返回 OrderItem .

我想知道是否 Shop::OrderItem之前未初始化 OrderItem并导致问题?

最佳答案

您遇到了命名空间冲突。取决于代码执行的位置,Shop可能是您在 models/shop.rb 中定义的 ActiveRecord 模型,或者它可能是您在 models/shops/*.rb 下定义的模块命名空间.这不仅会导致不可预测的执行,而且阅读起来也很困惑。

我建议使用“Shop”以外的模块命名空间。即使将其称为“MyShop”也会有所改进。但是,您可能仍然会遇到 Shop 之间的命名冲突。和 MyShop::Shop .您可能应该重命名 MyShop 模块下的 Shop 类以避免这种情况:

例如:

# model/my_shop/my_order.rb
class MyShop::MyOrder
# ...
end
# model/my_shop/my_order_item.rb
class MyShop::MyOrderItem
# ...
end

说了这么多,我觉得你正在为一个受伤的世界做好准备。使用服务对象可能会更好地解决这个问题。谷歌搜索“Rails 服务对象”以获得一些非常好的例子。

关于ruby-on-rails - Rails 命名空间类与现有的 active_record 模型相同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37302039/

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