如何在Rails的集合中找到集合中对象的实例

时间:2018-06-29 22:03:33

标签: ruby-on-rails ruby activerecord

我正在尝试编写一条if语句,该语句将在另一个集合中的集合中找到对象的实例...

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

因此,如果我想检查房子的任何人是否有一件白衬衫,我想做这样的事情:

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

但是,当我这样做时会出现错误:

  

我相信是因为在这种情况下,乘员是一个集合,但是我不确定应该采用哪种正确的方法或语法。

2 个答案:

答案 0 :(得分:3)

更简单的方法是在关系中添加更多的东西,这将在以后的不同用例中为您提供帮助:

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? } %>

答案 1 :(得分:0)

在这种情况下,我会去担任演示者/装饰者。

使用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模型内部