【问题标题】:Ruby on Rails: How to join two tablesRuby on Rails:如何连接两个表
【发布时间】:2010-10-20 08:32:32
【问题描述】:

我有一个索引页面,我想显示所有用户的个人资料及其相关照片。我正在使用插件 Paperclip 来拍摄照片。在 Profiles 控制器中,我有实例变量 @profile,但它只向我显示配置文件表中的表,而不是照片表。

@profile = Profile.find(:all, :include => :photos,
  :joins => "INNER JOIN photos ON photos.profile_id = profiles.id")

型号如下:

class Profile < ActiveRecord::Base
  has_many :photos
end

class Photo < ActiveRecord::Base
  belongs_to :profile
end

我希望能够在视图中显示的内容类似于:

  • John 的个人资料(例如,姓名、年龄、性别) - John 的照片(例如,只显示一张照片)
  • 此处显示玛丽的个人资料 - 此处显示玛丽的照片
  • 此处显示 Bob 的个人资料 - 此处显示 Bob 的照片

【问题讨论】:

  • 如果个人资料有很多照片,您如何确定要为特定个人资料显示哪张照片?这应该是一对一的关系吗? (在数据库中有几种不同的方法可以做到这一点 - 例如,个人资料可能有一个用于 profile_photo 的外键,或者照片中可能有一个布尔列,指示特定照片是否打算成为“主要”)
  • 是的,我有一个名为 primary 的布尔列。如果设置为 1,则应显示照片。

标签: ruby-on-rails join activerecord


【解决方案1】:

我已编辑我的答案以反映您的额外 cmets。

首先,您不需要:joins 参数; :include =&gt; :photos 应该为您处理“幕后”的加入。

这是完成您所要求的事情的一种方法。

(在模型中)

class Profile < ActiveRecord::Base
  has_many :photos
  has_one :primary_photo, :class_name => "Photo", :conditions => {:primary => true}
end

(在控制器中)

@profiles = Profile.find(:all, :include => :primary_photo)

(在视图中)

<% @profiles.each do |profile| %>
  Name: <%= profile.name %>
  Age: <%= profile.age %>
  Photo: <%= image_tag profile.primary_photo.url %>
<% end %>

【讨论】:

  • 我在 Photos 表中有一个名为 primary 的布尔列。只有当主列设置为 1 时,有没有办法显示照片?在 profile.photos.each 标记之后添加行 似乎不起作用。
  • 好的,现在可以了。我应该使用 tinyint 而不是 int 作为数据库中的主列。
猜你喜欢
  • 1970-01-01
  • 2011-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-24
  • 1970-01-01
相关资源
最近更新 更多