ingzane
ingzane

Reputation: 55

List data from two models

I have two models, Items and Calibrations. Items has many calibrations, meaning that every year the instruments have to be calibrated. Fields, date_calibration and date_expired, are located in the "calibrations" table. (Items: has_many :calibrations, calibration: belongs_to item)

I need list/show all the items that are expiring. I can list all the items without problem of course but, I don't know how to add date_expired to the list.

In the Items controller:

@items = Item.all.order("created_at DESC")

In the Index:

<% @items.each do |item| %>
  <tr>
    <td><%= item.cod %></td>
    <td><%= item.number %></td>
    <td><%= item.den_cont %></td>
    <td><%= item.branch %></td>
    <td><%= item.model %></td>
  </tr>
<% end %>

I'm using Aptana and PostgreSQL version 9.1, Ruby 2.1 and Rails 4.1. Can anyone of you suggest any solution or point me to the right direction?

UPDATE
What should I change to show the item using the sentence below..

Item_controller
Item.includes(:calibrations).where('calibrations.date_expired <= ?' , 2014/07/12)

Index
<% @items.each do |item| %>
Return undefined method each.

ALSO Any idea on how to show a traffic light depending on how many days left to calibration_date ?? Tks again!

Upvotes: 0

Views: 86

Answers (2)

Drew
Drew

Reputation: 2663

As long you have your relations properly defined in your models I do believe something similar to the following should do the trick!

Item.joins(:calibrations).where(date_expired <whatever condition>)

The equivalent SQL being:

SELECT          Items.* 
FROM            Items 
LEFT OUTER JOIN Calibrations 
ON              Calibrations.item_id = Items.item_id 
WHERE           date_expired <whatever condition>

With the equivalent SQL of the above statement being (using the includes method):

SELECT          * 
FROM            Items 
LEFT OUTER JOIN Calibrations 
ON              Calibrations.item_id = Items.item_id 
WHERE           date_expired <whatever condition>

Hope this helps!

Also, if you're not wanting to return any data related to the calibrations table (which it looks like this is the case), I would go with the joins method, however if you are, the includes method would be the way to go (http://tomdallimore.com/blog/includes-vs-joins-in-rails-when-and-where/)

Also, the following may be of interest: http://guides.rubyonrails.org/active_record_querying.html (particularly section 12)!

Upvotes: 1

Doydle
Doydle

Reputation: 921

@items = Item.includes(:calibrations)
             .where('calibrations.date_expired <= ?', some_date)

include will join the two tables and allow you to specify conditions on items based on columns from the calibrations table. I think that's what you wanted isn't it?

Upvotes: 1

Related Questions