在 Rails 中,如何从关系查询中仅 select 一个对象类型?
In Rails, how do I select only a single object type from a relation query?
如何 select 关系中的单个实体?我正在使用 Rails 4.2.3。我有以下查询,它连接到另一个 table,但我只想删除一个对象(“UserMyObjectTimeMatch”类型的对象)...
user_my_object_time_match = UserMyObjectTimeMatch.joins(:my_object_time)
.select(:user_my_object_time_match)
.where("race_time_id = ?", linked_my_object.race_times[0].id)
if !user_my_object_time_match.nil?
user_my_object_time_match.destroy
end
不幸的是,当调用“user_my_object_time_match.destroy”行时,会出现“参数数量错误(给定 0,预期 1)”错误,我相信这是因为我 selecting 不是正确的类型。我如何正确 select 关系中的对象?
使用 .where
查询你会得到一个 ActiveRecord 关系对象,你可以循环它,但是查看你的查询你会得到的结果是
#<ActiveRecord::Relation [#<UserMyObjectTimeMatch id: nil, user_my_object_time_match: some_id>]
即使您遍历此对象并进行销毁,运行 的查询也是
DELETE FROM "user_my_object_time_matches" WHERE "user_my_object_time_match"."id" = [["id", nil]]
id 为 nil,因此不会从您的数据库中删除任何内容。您将需要删除该 select 方法,然后对您得到的任何内容进行循环,但由于您想要单个对象,请尝试 #find_by(race_time_id: id)
然后从结果中直接执行 .destroy
.
如果您仍想通过 select 查询来使用 .destroy
,则执行 .select(:id, :user_my_object_time_match))
然后遍历每个并销毁。
使用 where
之类的东西将始终为您提供一组对象,而不仅仅是一个。 (从技术上讲,它还不是一个数组,而是一个 Relation
,因此您可以继续调用更多方法,如 where
、select
、includes
等,并构建 SQL 在 运行 之前查询。)此外,您 永远不会 从 where
等方法中获得 nil
;它只是一个 Relation
产生零条记录(Foo.where("1=0").to_a
是 []
而不是 nil
)。所以如果你 "know" 你只会得到零个或一个对象,你可以 Foo.where("bar").first
。然后你会得到对象或 nil
.
您可能还想查看 find_by
和 find_by!
,其中 return 是单个对象而不是关系。您甚至可以在其他 ActiveRecord 方法的末尾使用它,例如 Foo.where("bar").find_by(what: "ever")
.
如何 select 关系中的单个实体?我正在使用 Rails 4.2.3。我有以下查询,它连接到另一个 table,但我只想删除一个对象(“UserMyObjectTimeMatch”类型的对象)...
user_my_object_time_match = UserMyObjectTimeMatch.joins(:my_object_time)
.select(:user_my_object_time_match)
.where("race_time_id = ?", linked_my_object.race_times[0].id)
if !user_my_object_time_match.nil?
user_my_object_time_match.destroy
end
不幸的是,当调用“user_my_object_time_match.destroy”行时,会出现“参数数量错误(给定 0,预期 1)”错误,我相信这是因为我 selecting 不是正确的类型。我如何正确 select 关系中的对象?
使用 .where
查询你会得到一个 ActiveRecord 关系对象,你可以循环它,但是查看你的查询你会得到的结果是
#<ActiveRecord::Relation [#<UserMyObjectTimeMatch id: nil, user_my_object_time_match: some_id>]
即使您遍历此对象并进行销毁,运行 的查询也是
DELETE FROM "user_my_object_time_matches" WHERE "user_my_object_time_match"."id" = [["id", nil]]
id 为 nil,因此不会从您的数据库中删除任何内容。您将需要删除该 select 方法,然后对您得到的任何内容进行循环,但由于您想要单个对象,请尝试 #find_by(race_time_id: id)
然后从结果中直接执行 .destroy
.
如果您仍想通过 select 查询来使用 .destroy
,则执行 .select(:id, :user_my_object_time_match))
然后遍历每个并销毁。
使用 where
之类的东西将始终为您提供一组对象,而不仅仅是一个。 (从技术上讲,它还不是一个数组,而是一个 Relation
,因此您可以继续调用更多方法,如 where
、select
、includes
等,并构建 SQL 在 运行 之前查询。)此外,您 永远不会 从 where
等方法中获得 nil
;它只是一个 Relation
产生零条记录(Foo.where("1=0").to_a
是 []
而不是 nil
)。所以如果你 "know" 你只会得到零个或一个对象,你可以 Foo.where("bar").first
。然后你会得到对象或 nil
.
您可能还想查看 find_by
和 find_by!
,其中 return 是单个对象而不是关系。您甚至可以在其他 ActiveRecord 方法的末尾使用它,例如 Foo.where("bar").find_by(what: "ever")
.