Goro Kuroita wrote in post #968571:
> Hi,
> I'm developing with ruby-1.9. 1 rails 3.0.0.
> I want to relate 'User' model and 'Payment' model with condition which
> has the same value as 'user.testing' in 'payment.testing'
>
> I did
>
> Class User < ActiveRecord::Base
>     has_many payments, :conditions => ['testing = ?', self.testing]
> end
>
> This doesn't work.
> I tried also below, but doesn't work too.
> has_many payments, :conditions => ['testing = ?',
> #{self.send(:testing)}]

Maybe this could work:

class User < ActiveRecord::Base
 has_many :payments
 has_many :payments_with_testing,
          :class_name => 'Payment',
          :conditions => 'testing = \'#{self.testing}\''
end

and then I get this when running a test:

user_1.inspect
#<User id: 1, first_name: "Tom", last_name: "Smith", user_name:
"tom_smith", testing: "alfa", created_at: "2010-12-15 21:26:23",
updated_at: "2010-12-15 21:26:23">
# print user_1.payments [p.id, p.user_id, p.testing]
[[1, 1, "alfa"], [2, 1, "alfa"], [3, 1, "beta"]]
# print user_1.payments_with_testing [p.id, p.user_id, p.testing]
[[1, 1, "alfa"], [2, 1, "alfa"]]  ### only the associated records with
testing = 'alfa' are returned

user_2.inspect
#<User id: 2, first_name: "Chris", last_name: "Stone", user_name:
"chris_stone", testing: "gamma", created_at: "2010-12-15 21:26:23",
updated_at: "2010-12-15 21:26:23">
# print user_2.payments [p.id, p.user_id, p.testing]
[[4, 2, "alfa"], [5, 2, "gamma"]]
# print user_2.payments_with_testing [p.id, p.user_id, p.testing]
[[5, 2, "gamma"]]

 User Load (0.2ms)  SELECT "users".* FROM "users" WHERE ("users"."id"
= 1) LIMIT 1
 Payment Load (0.2ms)  SELECT "payments".* FROM "payments" WHERE
("payments".user_id = 1)
 Payment Load (0.2ms)  SELECT "payments".* FROM "payments" WHERE
("payments".user_id = 1 AND (testing = 'alfa'))
 User Load (0.1ms)  SELECT "users".* FROM "users" WHERE ("users"."id"
= 2) LIMIT 1
 Payment Load (0.1ms)  SELECT "payments".* FROM "payments" WHERE
("payments".user_id = 2)
 Payment Load (0.1ms)  SELECT "payments".* FROM "payments" WHERE
("payments".user_id = 2 AND (testing = 'gamma'))


This relies on the trick that the condition is only evaluated later in
the proces when quoted with single quotes.
(ref: http://www.dweebd.com/ruby/has_many-with-arguments/).

I would hope this could be done cleaner with a scope with a lambda,
but I didn't get this to work straight away.

HTH,

Peter

PS. I used this migration to create the payments table:

class CreatePayments < ActiveRecord::Migration
 def self.up
   create_table :payments do |t|
     t.references :user, :null => false
     t.string :testing
     t.timestamps
   end
 end

 def self.down
   drop_table :payments
 end
end

-- 
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-t...@googlegroups.com.
To unsubscribe from this group, send email to 
rubyonrails-talk+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/rubyonrails-talk?hl=en.

Reply via email to