从Rails中的关系数据库中获取信息

时间:2010-05-24 18:52:21

标签: ruby-on-rails sqlite sqlite3-ruby

我正试图从相册数据库中提取艺术家的名字。 这些是我的两个模型

class Album < ActiveRecord::Base

  belongs_to :artist

  validates_presence_of :title
  validates_length_of :title, :minimum => 5
 end

class Artist < ActiveRecord::Base

  has_many :albums

end

这是专辑控制器

 def index
 @ albums = Album.all

 respond_to do |format|
   format.html # index.html.erb
   format.xml  { render :xml => @albums }
 end
end

索引中的视图:

<% @albums.each do |album| %>
  <tr>
    <td><%=h album.id %></td>
    <td><%=h album.title %></td>
    <td><%=h album.artist.name %></td>
  </tr
<% end %>

我的最终结果html就像艺术家领域一样出现了!

#<Artist:0x000001022e4868>   

如果我将其设置为artist.name 我明白了:

undefined method `name' for nil:NilClass

我做错了什么?

5 个答案:

答案 0 :(得分:3)

您需要执行以下操作:

<%=h album.artist.name %>

你使用它的方式是显示整个对象,可以这么说。

答案 1 :(得分:3)

听起来你有没有艺术家的专辑(artist_id为null或设置为不再存在的artist_id)。

您可以尝试:

<%= h album.artist ? album.artist.name : 'N/A' %>

答案 2 :(得分:1)

另一种编写前面列举的内容的方法。

<%= h album.artist.name unless album.artist.blank? %>

我建议您进入脚本/控制台并手动完成拉动所有文章然后打印出所有艺术家名称的过程。

顺便说一句,如果您在生产中运行此代码,则应该使用预先加载

 @ albums = Album.find(:all, :includes => [:artist]) 

这会更有效率。

答案 3 :(得分:0)

保存您的艺术家 - >专辑关系正在发生一些事情。如果你收到了这个错误,你会得到一个nil艺术家,这意味着密钥没有保存在表格中。手动检查你的桌子,并确保关系是否存在,如果不是那么你在错误的地方,你应该修复你的保存。

答案 4 :(得分:0)

您确实在数据库表中正确设置了数据吗?如果您的Artist和Album模型正确保存,那么它应该如下所示:

artists table

id|name
---------------------
 1|The Beatles
 2|The Rolling Stones

albums table

id|artist_id|title
--------------------------------------------------
 1|1        |The White Album
 2|2        |Exile on Main Street
 3|1        |Sgt. Pepper's Lonely Hearts Club Band