current_user有一个或多个组。一个小组有一个或多个客户。
如何从可行数组中的current_user获取所有组中的所有客户端?
我有以下方法(我认为正确)
def clients_from_all_related_groups
@clients = []
current_user.groups.each do |c|
@clients << c.clients
end
end
但是当我在我的视图中尝试通过它们时,我在HTML中得到以下输出:
<a href="/clients/%23%3CActiveRecord::Associations::CollectionProxy::ActiveRecord_Associations_CollectionProxy_Client:0x5f9b200%3E">Client</a>
使用@clients.to_a.push
或@clients.push
时,情况相同。
我想,在我将客户端推入新阵列的那一刻,我打破了保存对象的轨道方式。
如何让它正常工作?
答案 0 :(得分:0)
这是因为c.clients
是一个关联,而不是一个数组。只有在您调用该关联上的方法(例如.all
或.each
)时,才会将记录实际提取到您可以迭代的内容(例如Array
)。
请尝试以下操作,看看是否会得到不同的结果:
...
current_user.groups.each do |c|
@clients << c.clients.all
end
@clients.uniq! # This removes duplicates
...
Rails中经常使用关联来迭代列表,例如视图中的客户端列表。在这种情况下,你可能会看到类似的东西:
# Just doing this from memory, not guaranteed to be perfect:
<% @group.clients.each do |c| %>
<%= render partial: 'client'. locals: { client: c } %>
<% end %>
但是在这种情况下.each
已在@group.clients
上调用,.each
是一种关联,当您在其上调用Client
时会返回一些可以迭代的内容。
有很多方法可以直接在数据库上通过SQL加载唯一的客户端列表。如果您有冒险精神,可以查看直接从DB获取唯一客户端列表所需的查询,作为{{1}}对象的数组,而不是在Ruby中构建列表,这将生成数据库命中至少为每个群体。在你的特定情况下,这可能无关紧要,但知道它是件好事。