Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 在Rails中,如何从关系查询中仅选择单个对象类型?_Postgresql_Ruby On Rails 4_Join_Relation - Fatal编程技术网

Postgresql 在Rails中,如何从关系查询中仅选择单个对象类型?

Postgresql 在Rails中,如何从关系查询中仅选择单个对象类型?,postgresql,ruby-on-rails-4,join,relation,Postgresql,Ruby On Rails 4,Join,Relation,如何从关系中选择单个实体?我使用的是Rails 4.2.3。我有下面的查询,它连接到另一个表上,但我只希望删除其中一个对象“UserMyObjectTimeMatch”类型的对象 user_my_object_time_match = UserMyObjectTimeMatch.joins(:my_object_time) .select(:user_my_object_time_match)

如何从关系中选择单个实体?我使用的是Rails 4.2.3。我有下面的查询,它连接到另一个表上,但我只希望删除其中一个对象“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\u my\u object\u time\u match.destroy”行时,会出现“错误数量的参数为0,预期为1”的错误,我相信这是因为我选择的对象类型不正确。如何正确地从关系中选择对象?

With.where query您将返回一个ActiveRecord关系对象,您可以对其进行循环,但是查看您的查询,您将得到的结果将是

#<ActiveRecord::Relation [#<UserMyObjectTimeMatch id: nil, user_my_object_time_match: some_id>]
id为零,因此不会从数据库中删除任何内容。您将需要删除该select方法,然后对得到的任何对象执行循环,但由于您需要单个对象,请尝试查找\u byrace\u time\u id:id,然后从结果中直接执行.destroy

如果仍要使用.destroy,请使用select查询,然后进行.select:id、:user\u my\u object\u time\u匹配,然后在每个对象上循环并销毁。

使用where之类的方法将始终为您提供对象的集合,而不仅仅是一个。从技术上讲,它还不是一个数组,而是一个关系,因此您可以继续调用更多方法,如where、select、includes等,并在运行之前构建SQL查询。同样,你永远不会从where这样的方法中得到nil;它只是一个产生零记录Foo的关系,其中1=0.to_a是[]而不是nil。所以,如果您知道只会得到零个或一个对象,那么可以先执行Foo.wherebar.first。然后你将得到对象或零


您可能还想查看find_by和find_by!返回单个对象而不是关系。你甚至可以在其他ActiveRecord方法的末尾使用它,比如Foo.wherebar.find\u bywhat:ever。

你读过这个吗?看一下find_by方法。是的,但我正在阅读文档中关于连接的部分,因为我使用的是相关对象关系中的条件。我不清楚如何将联接与find_by结合起来以获得所需对象类型的记录。
DELETE FROM "user_my_object_time_matches" WHERE "user_my_object_time_match"."id" = $1  [["id", nil]]