在关注点内创建关联的反向

Creating the reverse of an association within a concern

我有一个创建关联的问题:

# concerns/product.rb
module Product
  extend ActiveSupport::Concern

  included do
    has_many :products, class_name: "Product", foreign_key: :owner_id
  end
end

以及示例模型:

# models/user.rb
class User < ApplicationRecord
  include Product
end

如果我这样做:User.products.last 它工作正常。我也希望能够做到 Product.last.owner 但如果没有定义关联,它就无法工作。我无法在产品模型中定义它,因为我不知道哪些模型将包含创建关联的关注点。

我尝试使用 inverse_of:

创建关联
class Product < ApplicationRecord
  belongs_to :owner, inverse_of: :products
end

...但它不起作用,显然它需要一个 class 名称。

我也试过反思问题包含在哪些 classes 中,但是当问题包含在几个不同的模型中时,它会引发一些奇怪的错误。

如何从关注点中创建关联的逆向?

正如@engineersmnky 所指出的,如果不使用多态性,您实际上无法设置指向一堆不同 类 的关联:

# you can't have a class and a module with the same name in Ruby
# reopening the class/module will cause a TypeError
module ProductOwner
  extend ActiveSupport::Concern
  included do
    has_many :products, as: :owner
  end
end
class Product < ApplicationRecord
  belongs_to :owner, 
    inverse_of: :products,
    polymorphic: true
end
class User < ApplicationRecord
  include ProductOwner
end

关于您实际加入的信息必须存储在产品的某处table。如果你不使用多态性,你只有一个整数(或 UUID),它将始终引用单个 table.