Question

I am working with a legacy database and am also reading through the Rails guides on associations.

I have two models. A diary model and an animal model.

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 index view

<% @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 %>

As you can see it's showing the DiaryQueue from the animal table using:

<td><%= animal.DiaryQueue %>

and I am trying to show the DiaryName from the diary table with:

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

This fails with an exception error:

undefined method `DiaryName' for nil:NilClass

The @animals_todaysappointments method looks like this:

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

If I add:

delegate :DiaryName, :to => :diary

to the animal model then I get the following error:

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

Each animal record has a DiaryQueue value between 0 and 10 and the diary table has a number of rows, an example row is:

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

There are rows with the same DiaryNo, but they also have the same DiaryName. It's only the DiaryDate, SlotHour, TotalSlots, BlockBooked, FreeSlot and BookedSlot that alter in those rows.

To try and prevent the error I added the following to the view:

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

but I get an exception:

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

What am I doing wrong?

Was it helpful?

Solution

Given your answers above, you might need to change the belongs_to method in Animal to the following:

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

In your current implementation your models are going to try to match Animal#DiaryNo against Diary#DiaryNo, when what you've said you wanted is to match Animal#DiaryQueue against Diary#DiaryNo.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top