gpt4 book ai didi

ruby-on-rails - 我可以使用 AR 对象作为哈希键还是应该使用 object_id

转载 作者:数据小太阳 更新时间:2023-10-29 07:56:37 25 4
gpt4 key购买 nike

由于 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 中设置类似的东西,这样我就可以在 View 中循环遍历它

#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 }

我之所以要这样做是因为我不想从我的 View 中调用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 对象作为哈希键吗

我可以想象这可能会出错的几种情况( session 、模型中的对象更改等),但这只是为了在 View 中呈现

备选方案!

所以这是一种方法,另一种可能是这样

#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]

最佳答案

我认为使用散列是一种很好的组织方式。但是,我建议不要使用 user 或 big 一个对象作为散列键,这仅仅是因为它会使您的散列不可读,并且因为它实际上只有这个具有对象 ID 的唯一对象可以用作键。

o = Object.new
h = { o => 'something' }
h[Object.new] #=> nil

在您的情况下,这可能不是问题,因为您只需要对其进行迭代。但是,一旦您想对该散列做其他事情,或者您拥有相同 Active Record 数据的不同实例(这在 Rails 应用程序中很常见,除非您真正关注什么加载时)。除此之外,我认为坚持使用简单对象(字符串、符号)作为散列键的广泛使用的约定是很好的,以使您的代码可读和可维护。

也许最好保留一个二维散列,如下所示:

@users_with_things = Things.accessible_by(some_curent_user_logic).inject({}) do |a, thing|
user_id = thing.user.id
a[user_id] ||= { :user => thing.user, :things => [] }
a[user_id][:thing] << thing
a
end

然后您可以像这样在您的 View 中遍历 @users_with_things:

@users_with_things.each do |user_id, values|
# values[:user] is the user, values[:things] the array of things

关于ruby-on-rails - 我可以使用 AR 对象作为哈希键还是应该使用 object_id,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14279913/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com