Как найти экземпляр объекта в коллекции внутри коллекции в рельсах - PullRequest
0 голосов
/ 30 июня 2018

Я пытаюсь написать оператор if, который найдет экземпляр объекта в коллекции в другой коллекции ...

House 
has_many :occupants
Occupant 
has_many :shirts
belongs_to :house
Shirt
belongs_to :occupant

Так что, если я хочу проверить, есть ли у кого-нибудь из жильцов дома белая рубашка, я хочу сделать что-то вроде этого:

<% if @house.occuptants.shirts.where(:color => 'white') %>

Однако, когда я делаю это, я получаю ошибку:

неопределенный метод `shirts 'для #

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

Ответы [ 2 ]

0 голосов
/ 30 июня 2018

Я бы выбрал ведущего / декоратора в этом сценарии.

Используйте draper , чтобы украсить объект дома, например:

# /app/decorators/house_decorator.rb
class HouseDecorator < Draper::Decorator
  def count_occupants_with_white_shirts
    object.occupants.joins(:shirts).where(shirts: { color: 'white' } ).count
  end
end

Тогда по вашему мнению:

<% if @house.count_occupants_with_white_shirts > 0 %>

Надеюсь, это поможет.

ПРИМЕЧАНИЕ. Если вам не нужна дополнительная зависимость (Draper), вы также можете поместить этот метод внутрь себя House модель

0 голосов
/ 30 июня 2018

Что-то попроще, и это поможет вам позже для разных вариантов использования, это добавить больше к отношениям:

class House 
  has_many :occupants
  has_many :shirts, through: :occupants
end

class Occupant
  has_many :shirts
  belongs_to :house
  scope :females, -> { where(...) }   # This is homework for you: http://guides.rubyonrails.org/active_record_querying.html#scopes
end

class Shirt
  belongs_to :occupant
end

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

<% if @house.shirts.where(color: 'white').exists? %>

и чтобы проверить наличие женщин в рубашках белого цвета, выполните:

<% if @house.occupants.females.select { |o| o.shirts.where(color: 'white').exists? } %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...