关系为空时不要显示对象

时间:2012-02-23 14:11:34

标签: ruby-on-rails ruby-on-rails-3

关系是:

class apartment 
  belongs_to :house
end

class house
  has_many :apartments
end

在我的公寓控制器的索引方法中,我发现所有房屋都有houses.all。 在视图中有一幢房子与正确(has_many)公寓

问题:

有些房子没有公寓,我不想在我的公寓页面上展示这些房屋。我怎么能意识到这一点?

3 个答案:

答案 0 :(得分:2)

最好的方法是在你的房屋模型中使用命名范围,如下所示:

scope :filled, :joins => :apartments

在控制器操作中,你必须调用House.filled

这是使用select方法的解决方案:

House.select {|house| house.apartments.any?}

答案 1 :(得分:2)

当您枚举时,您可以通过多种方式执行此操作:

for house in houses
   if house.appartments.count > 0
     puts house.title
   end
 end 

或者当您使用示波器获取数据时:

scope :with_appartments, lambda { joins(:appartments).group('appartments.id').uniq { |h| h[:id] }  }
myHousesWithAppartments = House.with_appartemnts

或者您可以使用计数器缓存:http://railscasts.com/episodes/23-counter-cache-column

答案 2 :(得分:0)

您可以使用'empty?'方法:

<% if !(@house.apartments.empty?) %>
  <% @house.apartments.each do |aprtmt|
    <%= aprtmt.info %>
  <% end %>
<% end %>

这是查看它的最简单方法。正确的Rails说你应该把你的逻辑放在控制器中,而不是视图中。因此,更合适的实现将在您的Houses#Show控制器操作中:

@houses = House.all
@houses_with_apartments = []
@houses.each do |house|
  @houses_with_apartments << house unless house.empty?
end

然后在您的视图中使用@houses_with_apartments变量。

希望这有帮助。