按关系乘以记录

时间:2013-08-22 14:04:30

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

这是我的关系:

class House
 has_many: appartments
end

class Appartments
 belongs_to: house
end

class Region
 has_many: houses
end

控制器:

@country = Country.find(params[:country_id])
@regions = @country.regions
@house = House.find(params[:id])

查看

在房子页面上,我有一个标签,我想要显示属于房子的公寓。

这是我的循环:

- @regions.each do |region|
  - region.houses.each do |house|
    - @house.appartments.each do |appartment|
      %section
        .row
          .span5
            %h2 #{link_to appartment.name, country_region_appartment_path(@country, region, appartment)}
            %p

我创建了这个循环,因为我需要链接的区域值。它工作..我得到属于房子的公寓...但我乘以记录/输出。

我做错了什么?

Thanks..remco

1 个答案:

答案 0 :(得分:0)

@house与您视图中的region.houses无关。您遍历一个区域中的所有房屋,但随后您使用控制器@house上填充的相同变量 我也相信有一些协会缺失:

class Region
  has_many: houses
  belongs_to :country
end

class House
  has_many :appartments
  belongs_to :region
end

class Appartment
  belongs_to :house
end

在您的控制器上,您只需查询区域:

@country = Country.find(params[:country_id])
@regions = @country.regions

在您的视图中,您应该从家中移除@,因为它只引用一个预定义的房屋:

- @regions.each do |region|
  - region.houses.each do |house|
    - house.appartments.each do |appartment|

这是一种原始的方式,因为它会按需触发许多查询。因此,如果您有许多记录,则可以使用来自include的{​​{1}}和join等内容来热切地加载您的数据。