gpt4 book ai didi

ruby-on-rails - 使用 first_or_create 时,在 after_create 回调中,模型查询会自动添加额外条件

转载 作者:行者123 更新时间:2023-12-04 06:03:13 26 4
gpt4 key购买 nike

为了便于解释,我将使用 SQLite 创建一个全新的 Rails (3.2.13) 项目。

rails new TestApp
cd TestApp/
rake db:create
rails g model Blog name:string description:string
rake db:migrate

这是Blog模型的内容。

class Blog < ActiveRecord::Base
attr_accessible :description, :name

after_create :print_other_name


private

def print_other_name
# Just for example, running a query here.
blog = Blog.first
end
end

然后打开一个 rails 控制台

1.9.3-p125 :001 > blog = Blog.where( name: 'First Blog' ).first_or_create!( description: 'This is the first blog' )

Blog Load (0.2ms) SELECT "blogs".* FROM "blogs" WHERE "blogs"."name" = 'First Blog' LIMIT 1
(0.1ms) begin transaction
SQL (63.9ms) INSERT INTO "blogs" ("created_at", "description", "name", "updated_at") VALUES (?, ?, ?, ?) [["created_at", Thu, 09 May 2013 11:30:31 UTC +00:00], ["description", "This is the first blog"], ["name", "First Blog"], ["updated_at", Thu, 09 May 2013 11:30:31 UTC +00:00]]
======>>>>>>> Blog Load (0.6ms) SELECT "blogs".* FROM "blogs" WHERE "blogs"."name" = 'First Blog' LIMIT 1
(1.5ms) commit transaction
=> #<Blog id: 1, name: "First Blog", description: "This is the first blog", created_at: "2013-05-09 11:30:31", updated_at: "2013-05-09 11:30:31">

在上面的代码块中,请查看在INSERT 查询之后运行的查询:

Blog Load (0.6ms)  SELECT "blogs".* FROM "blogs" WHERE "blogs"."name" = 'First Blog' LIMIT 1

这是由模型的 after_create 中的 Blog.first 行生成的查询。

本来应该是一个没有任何条件的简单 LIMIT 1 查询,现在在查询中添加了一个 name 条件。经过大量测试,我意识到添加的条件是 Blog.where( name: 'First Blog' ).first_or_create!.... 行中提到的条件。

换句话说,无论我在 first_or_create 之前的 where 中使用什么条件,似乎都会自动添加到 after_create 中运行的所有查询中 回调。

我无法想象为什么这是预期的行为,但如果是这样,我在任何地方都找不到它的记录。

有人了解这种行为吗?这打破了我在 after_create 回调中的所有查询。

最佳答案

first_or_create 将整个查询包装在由 where 子句定义的范围内。您可以通过两种方式解决此问题:

  1. 而不是使用 first_or_create 使用 find_or_create_by 就像

    Blog.find_or_create_by( name: 'First Blog' )
  2. 在包含如下查询的所有回调中使用unscoped:

    def print_other_name
    # Just for example, running a query here.
    blog = Blog.unscoped.first
    end

关于ruby-on-rails - 使用 first_or_create 时,在 after_create 回调中,模型查询会自动添加额外条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16461104/

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