获取current_user组的所有唯一客户端

时间:2013-10-28 18:44:34

标签: ruby-on-rails activerecord ruby-on-rails-4

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时,情况相同。

我想,在我将客户端推入新阵列的那一刻,我打破了保存对象的轨道方式。

如何让它正常工作?

1 个答案:

答案 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中构建列表,这将生成数据库命中至少为每个群体。在你的特定情况下,这可能无关紧要,但知道它是件好事。