Rails 3 Поиск ребенка с бабушкой и дедушкой через него Другой родитель

63
7

Как запрос для бокового бабушки и дедушки в Ruby on Rails?

Например, у меня установлены следующие модели:

пользователь

class User < ActiveRecord::Base
has_many :registrations
end

Постановка на учет

class Registration < ActiveRecord::Base
belongs_to :user
belongs_to :competition
end

Соревнование

class Competition < ActiveRecord::Base
has_many :registrations
belongs_to :tournament
end

Турнир

class Tournament < ActiveRecord::Base
has_many :competitions
end

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

<% @users.each do |user| %>
<% if user.registrations..joins(:competition).where("competitions.tournament_id = #{params[:tournament]}").count > 0 %>
print out user information...
<% end %>
<% end %>

Это похоже на реальную половину - вы знаете, какой способ делать вещи, потому что я выбираю записи, которые мне не нужны, может ли кто-нибудь предложить более лучший способ Railsy выполнить это?

спросил(а) 2021-01-25T21:57:59+03:00 4 месяца, 4 недели назад
1
Решение
77

Первым шагом, который я предпринял бы для создания более "Railsy" решения, было бы перемещение логики запроса из представления и в слой модели. Вы можете добавить эти два запроса в свою модель турнира:

class Tournament < ActiveRecord::Base
has_many :competitions

def registrations
regs = []
self.competitions.each do |competition|
competition.registrations.each do |registration|
regs << registration
end
end
regs
end

def users
usrs = []
self.registrations.each do |registration|
usrs << registration.user
end
usrs
end

end

Теперь в представлении вы можете:

<% @tournament.users.each do |user| %>
User: <%= user.name %><br />
<% end %>

У вас также есть метод, который возвращает все регистрации в турнире, если вам когда-либо понадобится. Надеюсь, это поможет вам увидеть другой подход.

ответил(а) 2021-01-25T21:57:59+03:00 4 месяца, 4 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема