在我的情况下,我如何真实地使用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?
这是一个复杂的问题,但我完全没有完全理解。
感谢您的帮助,也许是一个很好的阅读链接!
答案 0 :(得分:2)
首先,Place和Album之间的关联不正确。你设置它的方式,看起来都没有foreign_key。换句话说,它应该是Album belongs_to :place
,place_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的文档 请在“渴望加载协会”标题下查看