.all.length vs .length in before_create - 疯狂的行为!?有人可以解释一下



我已经解决了我的问题,但我有 0 个想法为什么会发生这种情况,这是一个奇怪的错误吗?

我在成员资格模型中有一个创建前操作。

成员资格可以belong_to组织。 组织has_many成员资格。

before_create :check_payment_plan

然后我在check_payment_plan方法中有一些逻辑。 它做什么无关紧要。 因为我发现了以下行为:

当该方法如下所示时:

def check_payment_plan
     puts self.organization.memberships.length
end
**The membership is not created.**

当该方法如下所示时:

def check_payment_plan
     puts self.organization.memberships.all.length
end
**The membership is created.**

因此,如果有人在before_filter中没有创建模型的实例,请检查是否遵循上述模式,则使用 .all.length,以供将来参考。

谁能解释为什么会发生这种情况?!

您实际上可以将其简化为self.organization.memberships.count,这可以让计数在数据库级别进行,这可能会解决您遇到的问题。

最好的猜测是,模型只是代表单个实例,而不是所有实例。这就是为什么您必须先调用 .all。

最新更新