Rajkumar S
2006-Nov-13  08:17 UTC
using find to get the value from a table referenced by foreign key
Hello all,
I have 2 tables calls and clients:
clients:
+-----------+---------+------+-----+---------+----------------+
| Field     | Type    | Null | Key | Default | Extra          |
+-----------+---------+------+-----+---------+----------------+
| id        | int(11) |      | PRI | NULL    | auto_increment |
| ivr_id    | int(11) | YES  | MUL | NULL    |                |
| is_online | char(1) | YES  |     | NULL    |                |
+-----------+---------+------+-----+---------+----------------+
calls:
+-------------+--------------+------+-----+---------+----------------+
| Field       | Type         | Null | Key | Default | Extra          |
+-------------+--------------+------+-----+---------+----------------+
| id          | int(11)      |      | PRI | NULL    | auto_increment |
| src         | varchar(80)  | YES  |     | NULL    |                |
| start       | datetime     | YES  |     | NULL    |                |
| ivr_id      | int(11)      | YES  | MUL | NULL    |                |
| file_name   | varchar(255) | YES  |     | NULL    |                |
+-------------+--------------+------+-----+---------+----------------+
Here calls.ivr_id is the foreign key referring to clients.ivr_id
Corresponding models are :
class Call < ActiveRecord::Base
  belongs_to :client, :foreign_key => "ivr_id"
  def self.calls_and_is_online (from_time, to_time)
    find (:first,
          :conditions => [
            "start > :from_time and start <= :to_time
             and ivr_id <> 0
             and file_name like ''%wav''",
            {:from_time => from_time, :to_time => to_time}
          ])
  end
end
class Client < ActiveRecord::Base
  has_one :call, :foreign_key => "ivr_id"
end
My call_controller has a method
  def get_calls_and_is_online
    @date = Time.parse(params[:date])
    @calls_and_is_online = Call.calls_and_is_online(@date, @date+1.day)
  end
From my controller I can get all the details of call table with out
any problems. Now I want to get the is_online status of a call. The
rails book Chap: 18 says I can define some thing like price
line_item.product.price, but in my case when I use
<%@calls_and_is_online.client.is_online %> from my view, I get the error
 NoMethodError in Call#get_calls_and_is_online
I know that I am missing some thing small, but not able to find what,
even after searching a lot... Any helping hand here is much
appreciated.
raj
--~--~---------~--~----~------------~-------~--~----~
 You received this message because you are subscribed to the Google Groups
"Ruby on Rails: Talk" group.
To post to this group, send email to
rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org
To unsubscribe from this group, send email to
rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org
For more options, visit this group at
http://groups.google.com/group/rubyonrails-talk?hl=en
-~----------~----~----~----~------~----~------~--~---
Rajkumar S
2006-Nov-13  11:18 UTC
Re: using find to get the value from a table referenced by foreign key
Hi, Following up more on this... On 11/13/06, Rajkumar S <rajkumars-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:> Hello all, > > I have 2 tables calls and clients: > > clients: > +-----------+---------+------+-----+---------+----------------+ > | Field | Type | Null | Key | Default | Extra | > +-----------+---------+------+-----+---------+----------------+ > | id | int(11) | | PRI | NULL | auto_increment | > | ivr_id | int(11) | YES | MUL | NULL | | > | is_online | char(1) | YES | | NULL | | > +-----------+---------+------+-----+---------+----------------+ > > calls: > +-------------+--------------+------+-----+---------+----------------+ > | Field | Type | Null | Key | Default | Extra | > +-------------+--------------+------+-----+---------+----------------+ > | id | int(11) | | PRI | NULL | auto_increment | > | src | varchar(80) | YES | | NULL | | > | start | datetime | YES | | NULL | | > | ivr_id | int(11) | YES | MUL | NULL | | > | file_name | varchar(255) | YES | | NULL | | > +-------------+--------------+------+-----+---------+----------------+ > > Here calls.ivr_id is the foreign key referring to clients.ivr_id > > Corresponding models are : > > class Call < ActiveRecord::Base > belongs_to :client, :foreign_key => "ivr_id" > def self.calls_and_is_online (from_time, to_time) > find (:first, > :conditions => [ > "start > :from_time and start <= :to_time > and ivr_id <> 0 > and file_name like ''%wav''", > {:from_time => from_time, :to_time => to_time} > ]) > end > end > > class Client < ActiveRecord::Base > has_one :call, :foreign_key => "ivr_id" > end > > My call_controller has a method > > def get_calls_and_is_online > @date = Time.parse(params[:date]) > @calls_and_is_online = Call.calls_and_is_online(@date, @date+1.day) > end > > From my controller I can get all the details of call table with out > any problems. Now I want to get the is_online status of a call. The > rails book Chap: 18 says I can define some thing like price > line_item.product.price, but in my case when I use <%> @calls_and_is_online.client.is_online %> from my view, I get the error > > NoMethodError in Call#get_calls_and_is_onlineI added the following in my view: <%= xx = Call.find (56755) %> <%= debug(xx.client.class) %> <%= yy = Client.find(41842) %> <%= debug (yy.call.class) %> The corresponding sql queries are: Call Columns (0.000880) SHOW FIELDS FROM calls Call Load (0.000436) SELECT * FROM calls WHERE (calls.id = 56755) LIMIT 1 Client Load (0.000318) SELECT * FROM clients WHERE (clients.id 17575) LIMIT 1 Client Load (0.000303) SELECT * FROM clients WHERE (clients.id 41842) LIMIT 1 Client Columns (0.000466) SHOW FIELDS FROM clients Call Load (0.052974) SELECT * FROM calls WHERE (calls.ivr_id = 41842) The corresponding values in datbase are: SELECT ivr_id FROM calls WHERE (calls.id = 56755) LIMIT 1 +--------+ | ivr_id | +--------+ | 17575 | +--------+ In the second query, you can see that the value of 17575, is fine, but it should have queried for clients.ivr_id instead of clients.id. Now to the third query: SELECT ivr_id FROM clients WHERE (clients.id = 41842) LIMIT 1; +--------+ | ivr_id | +--------+ | 14302 | +--------+ but the fourth query is SELECT * FROM calls WHERE (calls.ivr_id = 41842) Here the inverse of the previous problem happened, calls.ivr_id is correct, but the value is 41842, while it should have been 14302. I get a feeling that I have messed up the belongs_to and has_many but I am not able to figure out what it is :( raj --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
Alan C Francis
2006-Nov-13  15:08 UTC
Re: using find to get the value from a table referenced by f
Hi Rajkumar, Is there reason you can''t just have a client_id field in the Call and let Rails to the work ? I''m assuming the ivr_id field is some kind of "3rd party" information and it might be better to not use that as the FK relationship between client and call. A. -- Posted via http://www.ruby-forum.com/. --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
Rajkumar S
2006-Nov-14  10:41 UTC
[Fixed] Re: using find to get the value from a table referenced by foreign key
I have finally fixed this: I was over riding the rails configuration at two places. 1. Primary key in Clients table is ivr_id instead of id 2. Foreign key referreng to clients table is ivr_id instead of client_id So this involves letting rails know that I have overridden the conventions at 2 places, 1. in Clients.rb use set_primary_key "ivr_id" so that rails know that the primary key is ivr_id instead of id 2. in Calls.rb use belongs_to :client, :foreign_key => "ivr_id" so that rails know that it should use ivr_id instead of client_id The actuall files are class Call < ActiveRecord::Base belongs_to :client, :foreign_key => "ivr_id" class Client < ActiveRecord::Base set_primary_key "ivr_id" has_many :calls Thanks every one, raj On 11/13/06, Rajkumar S <rajkumars-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:> Hi, > > Following up more on this... > > On 11/13/06, Rajkumar S <rajkumars-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote: > > Hello all, > > > > I have 2 tables calls and clients: > > > > clients: > > +-----------+---------+------+-----+---------+----------------+ > > | Field | Type | Null | Key | Default | Extra | > > +-----------+---------+------+-----+---------+----------------+ > > | id | int(11) | | PRI | NULL | auto_increment | > > | ivr_id | int(11) | YES | MUL | NULL | | > > | is_online | char(1) | YES | | NULL | | > > +-----------+---------+------+-----+---------+----------------+ > > > > calls: > > +-------------+--------------+------+-----+---------+----------------+ > > | Field | Type | Null | Key | Default | Extra | > > +-------------+--------------+------+-----+---------+----------------+ > > | id | int(11) | | PRI | NULL | auto_increment | > > | src | varchar(80) | YES | | NULL | | > > | start | datetime | YES | | NULL | | > > | ivr_id | int(11) | YES | MUL | NULL | | > > | file_name | varchar(255) | YES | | NULL | | > > +-------------+--------------+------+-----+---------+----------------+ > > > > Here calls.ivr_id is the foreign key referring to clients.ivr_id > > > > Corresponding models are : > > > > class Call < ActiveRecord::Base > > belongs_to :client, :foreign_key => "ivr_id" > > def self.calls_and_is_online (from_time, to_time) > > find (:first, > > :conditions => [ > > "start > :from_time and start <= :to_time > > and ivr_id <> 0 > > and file_name like ''%wav''", > > {:from_time => from_time, :to_time => to_time} > > ]) > > end > > end > > > > class Client < ActiveRecord::Base > > has_one :call, :foreign_key => "ivr_id" > > end > > > > My call_controller has a method > > > > def get_calls_and_is_online > > @date = Time.parse(params[:date]) > > @calls_and_is_online = Call.calls_and_is_online(@date, @date+1.day) > > end > > > > From my controller I can get all the details of call table with out > > any problems. Now I want to get the is_online status of a call. The > > rails book Chap: 18 says I can define some thing like price > > line_item.product.price, but in my case when I use <%> > @calls_and_is_online.client.is_online %> from my view, I get the error > > > > NoMethodError in Call#get_calls_and_is_online > > I added the following in my view: > > <%= xx = Call.find (56755) %> > <%= debug(xx.client.class) %> > > <%= yy = Client.find(41842) %> > <%= debug (yy.call.class) %> > > The corresponding sql queries are: > Call Columns (0.000880) SHOW FIELDS FROM calls > Call Load (0.000436) SELECT * FROM calls WHERE (calls.id = 56755) LIMIT 1 > Client Load (0.000318) SELECT * FROM clients WHERE (clients.id > 17575) LIMIT 1 > Client Load (0.000303) SELECT * FROM clients WHERE (clients.id > 41842) LIMIT 1 > Client Columns (0.000466) SHOW FIELDS FROM clients > Call Load (0.052974) SELECT * FROM calls WHERE (calls.ivr_id = 41842) > > The corresponding values in datbase are: > > SELECT ivr_id FROM calls WHERE (calls.id = 56755) LIMIT 1 > +--------+ > | ivr_id | > +--------+ > | 17575 | > +--------+ > > In the second query, you can see that the value of 17575, is fine, but > it should have queried for clients.ivr_id instead of clients.id. > > Now to the third query: > > SELECT ivr_id FROM clients WHERE (clients.id = 41842) LIMIT 1; > +--------+ > | ivr_id | > +--------+ > | 14302 | > +--------+ > > but the fourth query is SELECT * FROM calls WHERE (calls.ivr_id = 41842) > > Here the inverse of the previous problem happened, calls.ivr_id is > correct, but the value is 41842, while it should have been 14302. > > I get a feeling that I have messed up the belongs_to and has_many but > I am not able to figure out what it is :( > > raj >--~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---