gpt4 book ai didi

ruby-on-rails-3 - 什么时候在 Ruby on Rails ActiveRecord 中传递实例代替 id 起作用?

转载 作者:行者123 更新时间:2023-12-04 07:12:11 25 4
gpt4 key购买 nike

示例场景:模型 Worker belongs_to 模型 Bucket。

查看以下查询:

1.9.3p194 :045 > Worker.where(bucket_id: Bucket.first).count
(0.7ms) SELECT COUNT(*) FROM "workers" WHERE "workers"."bucket_id" = 1
=> 38
1.9.3p194 :046 > Worker.where(bucket_id: Bucket.first.id).count
(0.7ms) SELECT COUNT(*) FROM "workers" WHERE "workers"."bucket_id" = 1
=> 38

1.9.3p194 :047 > Worker.new bucket_id: Bucket.first
=> #<Worker id: nil, email: nil, created_at: nil, updated_at: nil, bucket_id: nil>
1.9.3p194 :048 > Worker.new bucket_id: Bucket.first.id
=> #<Worker id: nil, email: nil, created_at: nil, updated_at: nil, bucket_id: 2>

如您所见,在 where 函数的情况下,传递诸如 Bucket.first 的实例代替确切的 id。所以有人会认为它也适用于 new 函数。相反,它会默默地失败!

为什么会这样?

最佳答案

我相信这发生在 ActiveRecord::PredicateBuilder .您可以在那里看到,如果该值是一个 ActiveRecord::Base 对象,它将对其调用 idnew 方法不会触发此代码,因此它的行为会有所不同。

我更喜欢直接传入 id 。然而upcoming in Rails 4你将能够做到这一点:

Worker.where(bucket: Bucket.first).count

这与初始化非常相似:

Worker.new(bucket: Bucket.first)

一般来说,如果您设置/匹配的属性以 _id 结尾,我建议传递一个 id

更新:我还想指出,初始化会继承where条件。所以这将适用于 Rails 3.2:

Worker.where(bucket_id: Bucket.first).new

我假设最终会通过 PredicateBuilder,但不确定。尽管这有效,但我不推荐它。

关于ruby-on-rails-3 - 什么时候在 Ruby on Rails ActiveRecord 中传递实例代替 id 起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14493285/

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