Является ли хорошей практикой иметь дополнительные «удобные» ассоциации в Rails? - PullRequest
0 голосов
/ 07 сентября 2018

У меня есть схема базы данных с несколькими уровнями вложенности. Допустим, у него есть модель User, которая has_many Foo, Foo has_many Bar и Bar has_many Baz. Теперь предположим, что я хочу вернуть все Baz, принадлежащие данному User. Конечно, есть способ получить это только с помощью вышеуказанных ассоциаций, но, насколько мне известно, это обходно.

Для удобства я только что говорил, что User has_many Foo, Bar, и Baz. Тогда я могу легко вызвать любые записи, относящиеся к User. Кроме того, в любое время, когда мне постоянно требуется доступ к ассоциации, которая находится на нескольких уровнях, я просто создаю прямую ассоциацию. Кажется, до сих пор все работало нормально.

Я не могу найти много информации об этой практике в Интернете, поэтому я боюсь, что она не очень полезна и, возможно, не очень хороша. Это нормально? Есть ли лучший способ для перемещения вложенных через вложенные ассоциации, как это?

Ответы [ 2 ]

0 голосов
/ 07 сентября 2018

Я думаю, это нормально, если есть смысл, чтобы эти вещи принадлежали друг другу таким образом.

Например, я не вижу лучшего способа сделать:

Author has_many books has_many pages has_many words has_many letters

Вы можете связать их, выполнив:

Author has_many pages, through: :books

Rails определит соединения и сделает код более читабельным.

Вам нужно будет связать все модели, чтобы иметь возможность Author has_many letters, through: :books, например:

Books has_many words, through: :pages

Pages has_many letters, through: :words

0 голосов
/ 07 сентября 2018

Я бы использовал объединения и создавал вспомогательный метод, который выполнял бы глубоко вложенный поиск, собирая записи так, как они мне нужны. Вы можете прочитать больше о глубоко вложенных включениях в Rails - Вложенные включения в Active Records? . Я не могу сказать себе, если это лучшая практика.

class User
  def self.find_bazzes(user_id)
    bazs = []
    self.includes(foo: [{bar: [:baz]}]).find(user_id).foos.do |foo|
      foo.bars.each{|bar| bazs += bar.bazs}
    end
    bazs
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...