コード日進月歩

しんくうの技術的な小話、メモ、つれづれ、など

RailsのActiveRecordで主キーの配列を取りたい場合はidsメソッドで取得できる

pluck(:id) を使っていたのでメモ程度に。

動作環境

$ bin/rails -v
Rails 7.1.2

実例

Authorというモデルがあった場合、以下のように取得できる

Author.ids
# => [1, 2, 3]
Author Ids (0.6ms)  SELECT `authors`.`id` FROM `authors`
# => Array

こちらはModel側で主キーを別のものに指定している場合でもよしなに該当カラムを引き当ててくれるので、その点ではpluck(:id)よりも親切

実コード

実際のコードは以下の通り、再帰的なことをやっているのでわかりにくいが primary_key を使って取得している

def ids
  primary_key_array = Array(primary_key)

  if loaded?
    result = records.map do |record|
      if primary_key_array.one?
        record._read_attribute(primary_key_array.first)
      else
        primary_key_array.map { |column| record._read_attribute(column) }
      end
    end
    return @async ? Promise::Complete.new(result) : result
  end

  if has_include?(primary_key)
    relation = apply_join_dependency.group(*primary_key_array)
    return relation.ids
  end

  columns = arel_columns(primary_key_array)
  relation = spawn
  relation.select_values = columns

  result = if relation.where_clause.contradiction?
    ActiveRecord::Result.empty
  else
    skip_query_cache_if_necessary do
      klass.connection.select_all(relation, "#{klass.name} Ids", async: @async)
    end
  end

  result.then { |result| type_cast_pluck_values(result, columns) }
end

参考リンク