如何从Active Record记录集合中按ID检索记录?

时间:2017-10-24 16:03:47

标签: ruby-on-rails activerecord

如果我有一个从Active Record查询返回的记录集合,如果我知道它的ID,如何访问其中一条记录?

5 个答案:

答案 0 :(得分:1)

active_record_query = User.where(first_name: "Jim")
record = active_record_query.where(id: record_id).first

应该这样做。

或者,如果您在Active Record查询中已经有一堆记录,则可以提取具有已知ID的那个记录,如:

{{1}}

答案 1 :(得分:1)

有两种方法可以做到这一点。假设您有一个名为records的ActiveRecord关系,并且正在搜索id

  1. 您可以使用ActiveRecord::FinderMethods#find方法,但这会导致另一次调用数据库:

    records.find(id)

  2. 您可以通过调用Ruby的Enumerable#find方法在不使用数据库的情况下搜索集合,如下所示:

    records.find { |r| r.id == id }

  3. 虽然它们具有相同的名称,但我们在上面的示例中调用了两种不同的find方法。第一个将使用更多的数据库资源,而后者将使用更多的应用程序服务器资源。我不确定哪一个最快更快。

答案 2 :(得分:1)

假设我有一组用户,我想在该集合中找到ID = 3的用户:

foo = User.all
user3 = foo.find {|x| x.id == 3}

当然,如果您知道该ID,您可以找到它。假设我有一个用户表,我知道我想要的用户的ID是3:

user3 = User.find(3)

答案 3 :(得分:1)

您可以使用ActiveRecord::FinderMethods#find从数据库中找到记录。

Thing.find(1)将在数据库中查询SELECT things.* FROM things WHERE things.id = 1。如果无法找到记录,请提高ActiveRecord::NotFoundError。查找也可以与ID列表一起使用。

如果您已经从数据库加载了关系,则可以使用Enumerable#find或其别名#detect。 ActiveRecord :: Relation包括Enumerable,所以即使你没有显式地转换为.to_a的数组,它也能工作。

  

将枚举中的每个条目传递给阻止。返回第一个块   不是假的。如果没有对象匹配,则调用ifnone并返回它   指定时的结果,否则返回nil。

示例:

[1,2,3,4].find(&:even?) # => 2
User.all.load.find { |u| u.id == 1 }

答案 4 :(得分:0)

是。您可以使用find方法。

# Assuming you were retrieving an ActiveRecordRelation s
s = MyRecord.where(name: "test")
s.find(id)

有关详细信息,请参阅:http://api.rubyonrails.org/v5.0/classes/ActiveRecord/FinderMethods.html#method-i-find