Rails の Enumerable#index_with は、配列などの要素をキーにして、ブロックの返り値を値にした Hash を作れる。

%i[a b c].index_with(&:to_s)
# => { a: "a", b: "b", c: "c" }

逆に Enumerable#index_by は、ブロックの返り値をキーにして、要素そのものを値にした Hash を作る。

%w[a b c].index_by(&:to_sym)
# => { a: "a", b: "b", c: "c" }

つまり、次の 2 つは同じ Hash になる。

%i[a b c].index_with(&:to_s) == %w[a b c].index_by(&:to_sym)
# => true

参考