代码之家  ›  专栏  ›  技术社区  ›  Trip

从Rails中的关系数据库中绘制信息

  •  1
  • Trip  · 技术社区  · 14 年前

    我正试图从专辑数据库中提取艺术家的名字。 这是我的两个模特

    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 回复  |  直到 14 年前
        1
  •  1
  •   Schneems    14 年前

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

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

    我建议你去 脚本/控制台 手动完成所有文章的提取过程,然后打印出所有艺术家的姓名。

    顺便说一句,如果您在生产环境中运行此代码,那么您可能应该使用预加载

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

    这会更有效率。

        2
  •  3
  •   Slobodan Kovacevic    14 年前

    你需要做如下的事情:

    <%=h album.artist.name %>
    

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

        3
  •  3
  •   Tony Fontenot    14 年前

    听起来您有一张没有艺术家的专辑(艺术家ID为空或设置为不再存在的艺术家ID)。

    你可以试试:

    <%= h album.artist ? album.artist.name : 'N/A' %>
    
        4
  •  0
  •   John Topley    14 年前

    在数据库表中是否正确设置了数据?如果正确保存了您的艺术家和专辑模型,则应如下所示:

    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
    
        5
  •  0
  •   John Topley    14 年前

    正在保存您的艺术家->专辑关系。如果你得到了那个错误,你得到了一个零艺术家回来,这意味着钥匙没有被保存在表中。手动检查您的表,确保关系存在。如果关系不存在,则说明您查找的位置不正确,应修复保存。