Простые ассоциации с устаревшей базой данных в Rails 3?

Я работаю с устаревшей базой данных, а также читаю руководства Rails по ассоциациям.

У меня есть две модели. diary модель и animal модель.

diary.rb

class Diary < ActiveRecord::Base
  establish_connection :premvet

  attr_accessible :DiaryNo ,:DiaryName, :DiaryDate, :SlotHour, :TotalSlots, :BlockSlots, :BlockBooked, :FreeSlot, :BookedSlot

  self.table_name = 'diary'
  self.primary_key = 'DiaryNo'

  has_many :animals, :foreign_key => 'DiaryQueue'
end

animal.rb

class Animal < ActiveRecord::Base
  establish_connection :premvet

  self.table_name = 'animal'
  self.primary_key = 'PVID'

  attr_accessible :AddedBy, :Age, :AnimalBFAmount, :AnimalBalance, :AnimalName, :Archive, :BillType, :Breed, :ChronicStatus, :Class, :Classification, :ClientKey, :Colour, :Date1, :DateOfBirth, :DateofBirth, :Dead, :DiaryQueue, :DiscField, :DrugsAtCost, :DrugsNoVAT, :ESDAmount, :ESDType, :FNote, :FirstRegisteredDate, :Height, :IDNumber, :Insured, :InsuredWith, :IsClient, :IsClientDate, :IsMaster, :LastBilledAmount, :LastBilledDate, :LastConsDate, :LastContributionDate, :LastPaidDate, :LastWeightDate, :Locked, :LoyaltyMultiplier, :LoyaltyPoints, :MR_Flag_0, :MR_Flag_1, :MR_Flag_10, :MR_Flag_11, :MR_Flag_12, :MR_Flag_13, :MR_Flag_14, :MR_Flag_15, :MR_Flag_2, :MR_Flag_3, :MR_Flag_4, :MR_Flag_5, :MR_Flag_6, :MR_Flag_7, :MR_Flag_7, :MR_Flag_8, :MR_Flag_9, :Mileage, :Neutered, :NextApptDate, :ORT, :OldSex, :Opt_Flag_0, :Opt_Flag_1, :Opt_Flag_2, :Opt_Flag_3, :Opt_Flag_4, :Opt_Flag_5, :Opt_Flag_6, :Opt_Flag_7, :PVID, :PreferredContact, :PreferredUser, :Ref1, :RefPrac, :ReferredBy, :SSDType, :SeenInPeriod, :SendBill, :Sex, :SiteAnimal, :Species, :Status, :SurcAmount, :SurcType, :SurgeryNumber, :TBU, :TOSAmount, :TOSDrugs, :TOSFees, :TOSType, :Weight

  belongs_to :client, :foreign_key => 'ClientKey'
  belongs_to :diary, :foreign_key => 'DiaryNo'
end

индекс животных

<% @animals_todaysappointments.each do |animal| %>
  <tr>
    <td><%= animal.id %></td>    
    <td><%= animal.AnimalName %></td>
    <td><%= link_to animal.client.Surname, animal.client %></td>    
    <td><%= animal.Species %></td>
    <td><%= animal.Breed %></td>
    <td><%= animal.NextApptDate.strftime("%d %b. %Y -  %H:%M") %></td>        
    <td><%= animal.DiaryQueue %>
    <td><%= animal.diary.DiaryName %></td>    
    <td><%= link_to 'Show', animal %></td>
  </tr>
<% end %>

Как вы можете видеть, он показывает DiaryQueue из таблицы животных, используя:

<td><%= animal.DiaryQueue %>

и я пытаюсь показать DiaryName из таблицы дневников с помощью:

<td><%= animal.diary.DiaryName %></td>    

Это терпит неудачу с ошибкой исключения:

undefined method `DiaryName' for nil:NilClass

@animals_todaysappointments Метод выглядит так:

def appointments
    @animals_todaysappointments = Animal.where('DATE(NextApptDate) = ?', Date.today).page(params[:page]).per_page(15).order('NextApptDate ASC')
    respond_to do |format|
      format.html # index.html.erb
    end
  end

Если я добавлю:

delegate :DiaryName, :to => :diary

к модели животного, тогда я получаю следующую ошибку:

Animal#DiaryName delegated to diary.DiaryName, but diary is nil: #

Каждая запись о животном имеет значение DiaryQueue в диапазоне от 0 до 10, а таблица дневника имеет количество строк, пример строки:

DiaryNo  DiaryName  DiaryDate  SlotHour  TotalSlots  BlockBooked  FreeSlot  BookedSlot
--------------------------------------------------------------------------------------
1        Morning    2012-07-16 9         18          0            0         18

Есть строки с одинаковым DiaryNo, но они также имеют одинаковое DiaryName. В этих строках изменяются только DiaryDate, SlotHour, TotalSlots, BlockBooked, FreeSlot и BookedSlot.

Чтобы попытаться предотвратить ошибку, я добавил следующее в представление:

<% unless animal.DiaryName.nil? %>
 <td><%= animal.DiaryName %></td>
<% else %>
 <td><%= animal.DiaryQueue %>
<% end %>  

но я получаю исключение:

Animal#DiaryName delegated to diary.DiaryName, but diary is nil: #

Что я делаю неправильно?

1 ответ

Решение

Учитывая ваши ответы выше, вам может потребоваться изменить метод own_to в Animal следующим образом:

belongs_to :diary, :foreign_key => "DiaryQueue", :primary_key => "DiaryNo"

В вашей текущей реализации ваши модели будут пытаться соответствовать Animal#DiaryNo против Diary#DiaryNo, когда то, что вы сказали, вы хотели, чтобы соответствовать Animal#DiaryQueue против Diary#DiaryNo,

Другие вопросы по тегам