0

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.pushor时也是如此@clients.push

我想当我将客户推入一个新数组的那一刻,我打破了保存对象的方式。

我怎样才能让它正常工作?

4

1 回答 1

0

这是因为c.clients是一个关联,而不是一个数组。只有当您调用该关联上的方法(例如.allor .each)时,记录才会真正被提取到您可以迭代的内容中(例如 an 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,它会返回一些你可以迭代的东西。

边注:

有一些方法可以通过 SQL 直接在数据库上加载唯一的客户端列表。如果您喜欢冒险,您可以查看直接从数据库中获取唯一客户列表所需的查询,作为对象数组Client,而不是在 Ruby 中构建列表,这将至少为每个组生成数据库命中. 在您的特定情况下可能无关紧要,但知道这是一件好事。

于 2013-10-28T18:49:27.437 回答