如何将 class 方法转换为两个模型之间的关系?
How do I convert a class method into a relation between two models?
我有 BasePlan
has_many
Plan
的型号。我们在 BasePlan
中使用 class 方法按字母顺序对关联的 Plan
进行排序,我需要将其重构为两个模型之间的关联。
BasePlan
class:
has_many :plans, -> { extending BuildWithAccount },
inverse_of: :base_plan, dependent: :destroy
Plan
class:
belongs_to :base_plan
BasePlan
class 按字母顺序排列计划的方法:
def order_plans_alphabetically
plans.order(code: :asc)
end
我在 BasePlan
中创建了一个新协会,如下所示:
has_many :alphabetically_ordered_plans, -> { order_plans_alphabetically }, class_name: "Plan"
这导致:
NameError: undefined local variable or method `order_plans_alphabetically' for #<Plan::ActiveRecord_Relation:0x00005593e3876460>
我还尝试在现有协会的 lambda
中包含 class 方法,导致超过 100 次测试失败,所以我认为这也不是可行的方法。
将 class 方法重构为两个模型之间的关系的有效方法是什么?
has_many :alphabetically_ordered_plans,
-> { order(code: :asc) # short for Plan.order(code: :asc) },
class_name: "Plan"
评估 lambda 的上下文不是 BasePlan 类)而是关联(计划)的 class。如果你真的想使用范围(基本上只是一个 class 方法)你需要把它放在 class:
class Plan < ApplicationRecord
belongs_to :base_plan
scope :order_by_code, ->{ order(code: :asc) }
end
class BasePlan < ApplicationRecord
has_many :alphabetically_ordered_plans,
-> { order_by_code },
class_name: "Plan"
end
我有 BasePlan
has_many
Plan
的型号。我们在 BasePlan
中使用 class 方法按字母顺序对关联的 Plan
进行排序,我需要将其重构为两个模型之间的关联。
BasePlan
class:
has_many :plans, -> { extending BuildWithAccount },
inverse_of: :base_plan, dependent: :destroy
Plan
class:
belongs_to :base_plan
BasePlan
class 按字母顺序排列计划的方法:
def order_plans_alphabetically
plans.order(code: :asc)
end
我在 BasePlan
中创建了一个新协会,如下所示:
has_many :alphabetically_ordered_plans, -> { order_plans_alphabetically }, class_name: "Plan"
这导致:
NameError: undefined local variable or method `order_plans_alphabetically' for #<Plan::ActiveRecord_Relation:0x00005593e3876460>
我还尝试在现有协会的 lambda
中包含 class 方法,导致超过 100 次测试失败,所以我认为这也不是可行的方法。
将 class 方法重构为两个模型之间的关系的有效方法是什么?
has_many :alphabetically_ordered_plans,
-> { order(code: :asc) # short for Plan.order(code: :asc) },
class_name: "Plan"
评估 lambda 的上下文不是 BasePlan 类)而是关联(计划)的 class。如果你真的想使用范围(基本上只是一个 class 方法)你需要把它放在 class:
class Plan < ApplicationRecord
belongs_to :base_plan
scope :order_by_code, ->{ order(code: :asc) }
end
class BasePlan < ApplicationRecord
has_many :alphabetically_ordered_plans,
-> { order_by_code },
class_name: "Plan"
end