Метод, который показывает пользователям карты являются частью


Немного предыстории:

Мое приложение имеет две модели под названием mapgroups и usergroups. А map принадлежит к group и user принадлежит group. Вы можете зайти в группу и добавить карты как карты "приписанный" к пользователю. Они будут отображаться на приборной панели.

class User < ApplicationRecord
  def fetch_maps
    @groups = self.groups
    @maps = Array.new

    @groups.each do |g|
      g.maps.each do |m|
        @maps << m
      end
    end

    return @maps
  end
end

Для отображения карты пользователь должен был показать в своей ленте я создал fetch_maps метод для вызова на текущего пользователя.

Им интересно, если есть способ, чтобы прибраться или просто какие-либо отзывы. Это первый метод, который я написал с текущей рубиновый знаний.

Редактировать:

Модель Mapgroup

class Mapgroup < ApplicationRecord
  belongs_to :map, optional: true
  belongs_to :group, optional: true
end

Модель Группы

class Usergroup < ApplicationRecord
  belongs_to :user, optional: true
  belongs_to :group, optional: true
end


Комментарии
2 ответа

Это может быть очень дорогой способ, чтобы сделать это, вы должны запросить dtabase один раз для каждой группы пользователя, т. е. в N+1 запросов. Вы должны быть в состоянии сделать это с одного запроса на создание связи:

class User < ApplicationRecord
belongs_to :usergroup
has_many :groups, through: :usergroup
has_many :maps, through: :groups

затем вы можете просто запросить карту связи. В качестве альтернативы можно использовать соединение. Есть больше чем один способ сделать это, но вы могли бы сделать:

def fetch_maps
Map.joins(:mapgroups => {:groups => :users} ).where(user: self)
end

Рельсы не всегда выполняются запросы так, как вы ожидаете, поэтому я предлагаю вам запустить ваш код в консоли или смотреть свои лог-файлы, чтобы убедиться, что вы выполняете только один запрос.

3
ответ дан 5 марта 2018 в 06:03 Источник Поделиться

Я не вижу никаких причин, чтобы использовать переменные экземпляра @groups и @maps вместо локальных переменных. (Вы можете использовать переменные экземпляра для кэширования результатов поиска, но это не то, что вы сделали здесь.)

В общем, есть более элегантные способы, чтобы выразить конкатенация массива в цикле. Я рекомендую Enumerable#flat_map в этом случае.

class User < ApplicationRecord
def fetch_maps
self.groups.flat_map { |g| g.maps }
end
end

В return обычно подразумевается в Руби.

1
ответ дан 5 марта 2018 в 04:03 Источник Поделиться