在关注点内创建关联的反向
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.
我有一个创建关联的问题:
# 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.