Ruby のすばらしさにより、任意のオブジェクトをキーとして使用できます。
document = Document.find 1
o = Hash.new
o[1] = true
o[:coool] = 'it is'
o[document] = true
# an it works
o[document]
#=> true
しかし、それが可能だからといって、それが良い習慣であるとは限りません
ただし、コントローラーで同様のものを設定する必要がある状況があるため、ビューでループすることができます
#controller
@users_with_things = Hash.new
Things.accessible_by(some_curent_user_logic).each do |thing|
@user_with_things[thing.user] ||= Array.new
@user_with_things[thing.user] << thing.id
end
#view
- @users_with_things.each do |user, thing_ids|
%input{type: :checkbox, name: "blank[user_#{user.id}]", value: 1, class: "select_groups", :'data-resource-ids' => "[#{thing_ids.join(',')}]", :'data-user-type' => user.type }
なぜこのようにしたいのかというと、自分の観点から呼び出したくないUser.find_by_id
(綺麗にしたい)からです
#controller
@users_with_things = Hash.new
Things.accessible_by(some_curent_user_logic).each do |thing|
@user_with_things[thing.user.id] ||= Array.new
@user_with_things[thing.user.id] << thing.id
end
#view
- @users_with_things.each do |user_id, thing_ids|
- user = User.find user_id
%input{type: :checkbox, name: "blank[user_#{user.id}]", value: 1, class: "select_groups", :'data-resource-ids' => "[#{thing_ids.join(',')}]", :'data-user-type' => user.type }
だから私の最初の質問は:このような状況で ActiveRecord オブジェクトをハッシュキーとして使用しても大丈夫ですか?
これがうまくいかない可能性があるいくつかのシナリオ (セッション、モデルでオブジェクトが変更されたときなど) を想像できますが、これはビューでレンダリングするためだけのものです。
別 !
これはそれを行う1つの方法であり、もう1つはこのようなものかもしれません
#controller
@users_with_things = Hash.new
Things.accessible_by(some_curent_user_logic).each do |thing|
@user_with_things[thing.user.object_id] ||= Array.new
@user_with_things[thing.user.object_id] << thing.id
end
#view
- @users_with_things.each do |user_object_id, thing_ids|
- user = ObjectSpace._id2ref(user_object_id) #this will find user object from object_id
%input{type: :checkbox, name: "blank[user_#{user.id}]", value: 1, class: "select_groups", :'data-resource-ids' => "[#{thing_ids.join(',')}]"", :'data-user-type' => user.type }
...さらにハードコアです。hash[ARobject] = :something
ただし、何らかの理由で大きなメモリクラスターが作成される場合は回避策です
質問 2:このようにするのは良い考えですか?
完全にするために、別の選択肢もあり、それは
# ...
@user_with_thing[ [thing.user.id, thing.user.type] ] << thing_id
# ...
基本的に配列オブジェクトがキーになります
@user_with_thing[ [1, 'Admin'] ]
#=> [1,2,3]