Iain_A
August 3, 2007, 4:39pm
1
I have a the following models
CLIENT - has_many -> CAMPAIGNS - has_many -> CODES -> has_many ->HITS
So obviously a client has many codes, but each is linked to a
campaign. Now I have managed to get all the codes by using
has_many :codes, :through=>:campaigns
so the model looks like this
class Client < User
has_many :campaigns
has_many :codes, :through=>:campaigns
Now is it possible to make the client have many hits, which would
encompass all hits on all codes over all campaigns. Or Do I have to
loop through every campaign and every code and every hit to find all
the hits for a client.
Iain_A
August 3, 2007, 4:59pm
2
Try :
has_many :codes, :through=>:campaigns, :include => :hits
then
client.codes.map(&:hits).inject(&:+)
On 8/3/07, Iain A. [email protected] wrote:
so the model looks like this
–
Cheers!
Iain_A
August 3, 2007, 5:00pm
3
Actually, that’d depend on what’s exactly inside yout Hit model.
On 8/3/07, Pratik [email protected] wrote:
I have a the following models
class Client < User
–
Cheers!
–
Cheers!
Iain_A
August 3, 2007, 5:10pm
4
My hit model has a month, a year and a hit count, and obv a code_id.
what does client.codes.map(&:hits).inject(&:+) do? i.e the
map(&:hits).inject(&:+)
Iain_A
August 3, 2007, 5:16pm
5
Ah. Try :
In client.rb :
has_many :codes, :through=>:campaigns, :include => :hits
def hits
self.codes.map(&:hits).flatten.map(&:hit_count).inject(&:+)
end
Then for example :
client = Client.find(:first).hits
Explaination of
“self.codes.map(&:hits).flatten.map(&:hit_count).inject(&:+)” do :
self.codes will get you all associatied codes.
.map(&:hits) will return array of associatiated hits with codes.
It’ll be an array of array. So we use .flatten
map(&:hit_count) will return array of hit_count from all Hit objects
in the array
inject(&:+) is just a fancy way to do sum.
e.g. [1,2,3].inject(&:+) => 6
On 8/3/07, Iain A. [email protected] wrote:
On 8/3/07, Iain A. [email protected] wrote:
so the model looks like this
–
–
Cheers!
Iain_A
August 3, 2007, 5:38pm
6
That sounds great. Thanks Alot.