铁轨关系,至少3个级别

时间:2011-10-11 17:38:40

标签: ruby-on-rails relationships

在我的情况下,我如何真实地使用rails关系?

我正在制作夜生活网站,只是为了让您了解背景情况。它有三个模型,我想在一个页面上加入:地方,专辑,照片。

因此,photos中的albums工作得很好,我在那里使用带有连接的自定义编码的sql。 但是当我点击place时,我希望看到来自place模型的信息以及带有示例albums的{​​{1}}列表(例如首先)

现在我有以下内容:

photo

我是如何在我的控制器中得到的:

class Place < ActiveRecord::Base
  has_many :albums
end

class Album < ActiveRecord::Base
  has_many :photos
  has_one :place
end

class Photo < ActiveRecord::Base
  belongs_to :album
end

我将@ place.albums作为带有专辑数据的对象。但我不想@place = Place.find( params[:id], :include => :albums ) 张照片t know how to dig even deeper to reach the:include =&gt; :相册model. And anywhay i can地点because i have no direct relations between相册and相册&gt;照片`所以需要sql join?

这是一个复杂的问题,但我完全没有完全理解。

感谢您的帮助,也许是一个很好的阅读链接!

2 个答案:

答案 0 :(得分:2)

首先,Place和Album之间的关联不正确。你设置它的方式,看起来都没有foreign_key。换句话说,它应该是Album belongs_to :placeplace_id表中的albums

其次,要获得每张专辑的第一张照片:

<% @place.albums.each do |album| %>
  Sample Photo: <%= image_tag(album.photos.first.url) %>
<% end %>

如果你真的想,你可以从一行中的第一张专辑中获得第一张照片:

<%= image_tag(@place.albums.first.photos.first.url) %>

首先请注意,如果您不添加条件,则很容易出现nil错误,所以我实际上并不推荐这种方法。但是,如果你要使用它,我只想在Place模型中添加一个方法:

def first_photo
  albums.first.photos.first
end

在你看来:

<%= image_tag(@place.first_photo.url) %>

您也希望将这些内容加入到一起,这样您就不会执行太多查询。奥格斯精灵的答案涵盖了这一点。

答案 1 :(得分:1)

嵌套包含的哈希语法。它也适用于连接。

@place = Place.find( params[:id], :include => {:albums => :photos} )

以下是此http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html的文档 请在“渴望加载协会”标题下查看