Получение информации из реляционных баз данных в Rails - PullRequest
1 голос
/ 24 мая 2010

Я пытаюсь извлечь имя исполнителя из базы данных альбомов. Это мои две модели

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 ]

3 голосов
/ 24 мая 2010

Звучит так, как будто у вас есть альбом без исполнителя (либо Artist_id имеет значение null, либо установлен в Artist_id, которого больше нет).

Вы можете попробовать:

<%= h album.artist ? album.artist.name : 'N/A' %>
3 голосов
/ 24 мая 2010

Вам нужно сделать что-то вроде:

<%=h album.artist.name %>

То, как вы его использовали, отображает весь объект, так сказать.

1 голос
/ 25 мая 2010

Еще один способ написать то, что было перечислено ранее.

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

Я бы порекомендовал зайти в script / console и вручную выполнить процесс извлечения всех ваших статей, а затем распечатать все имена исполнителей.

Кстати, если вы запускаете этот код в рабочей среде, вам, вероятно, следует использовать готовую загрузку

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

Это будет намного эффективнее.

0 голосов
/ 24 мая 2010

Правильно ли настроены данные в таблицах базы данных?Если ваши модели 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
0 голосов
/ 24 мая 2010

Что-то происходит для сохранения ваших артистов -> альбомных отношений.Если вы получаете эту ошибку, вы получаете нулевого исполнителя, что означает, что ключ не сохраняется в таблице.Проверьте свою таблицу вручную и убедитесь, что связь существует, если ее нет, то вы ищете не в том месте, вам следует исправить сохранение.

...