【问题标题】:multiply records by relationship将记录乘以关系
【发布时间】:2013-08-22 14:04:29
【问题描述】:

这是我的亲戚:

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

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

我做错了什么?

谢谢..remco

【问题讨论】:

  • 您能否更准确地说明您的问题/您的期望?
  • 我想显示属于这所房子的公寓......它可以工作,但它显示的公寓是多次的
  • 尝试使用appartments = @regions.flat_map(&:houses).flat_map(&:appartments).uniq,然后使用.each进行循环
  • 嘿 Remco,如果这是或可能会是协作努力 - 你永远不应该拼错像模型这样大的东西。您的Appartment 模型实际上应该是Apartment。不过你的选择。

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


【解决方案1】:

@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|

这是一种原始的方法,因为它会按需触发许多查询。因此,如果您有很多记录,您可以看看使用 includejoin 之类的东西从 ActiveRecord 急切加载您的数据。

【讨论】:

  • 我试过了,但后来我得到了该地区的所有公寓,而不是房子
  • Murifo...谢谢...我尝试了您的想法,但后来我得到了该地区的所有公寓...
猜你喜欢
  • 2011-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多