我正在尝试编写一条if语句,该语句将在另一个集合中的集合中找到对象的实例...
House
has_many :occupants
Occupant
has_many :shirts
belongs_to :house
Shirt
belongs_to :occupant
因此,如果我想检查房子的任何人是否有一件白衬衫,我想做这样的事情:
<% if @house.occuptants.shirts.where(:color => 'white') %>
但是,当我这样做时会出现错误:
#
我相信是因为在这种情况下,乘员是一个集合,但是我不确定应该采用哪种正确的方法或语法。
答案 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
模型内部