Hi, I have 3 models Product has_many :mutations def current_stock <blablabla here I calculated the current stock of the product> end Mutation belongs_to :product belongs_to :location Location has_many :mutations Question: I can show the currect stock of a product with product.current_stock but how do a walk through all locations and show the different current stock of per location. I was thinkinf of using has many through and the use something like product.current_stock.locations.each etc. But ofcourse that does not work. Who can help ? --~--~---------~--~----~------------~-------~--~----~ 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 -~----------~----~----~----~------~----~------~--~---
On 2/23/07, bitterbal <portie-kFg6fFbE636XDw4h08c5KA@public.gmane.org> wrote:> > > Hi, > > I have 3 models > > Product > has_many :mutations > > def current_stock > <blablabla here I calculated the current stock of the product> > end > > > Mutation > belongs_to :product > belongs_to :location > > Location > has_many :mutations > > > Question: > > I can show the currect stock of a product with > > product.current_stock > > but how do a walk through all locations and show the different current > stock of per location. I was thinkinf of using has many through and > the use something like product.current_stock.locations.each etc. > > But ofcourse that does not work. > > Who can help ? >Correct me if I''m wrong, but is this what you''re looking for? Product has_many :locations, :through => :mutations end Mutations belongs_to :product belongs_to :location end Location has_many :products, :through => :mutations end product_stocks = Location.products.collect {|x| x.current_stock} If you need the name you could do something like Location.products.each { |product| products[product.name] product.current_stock } --~--~---------~--~----~------------~-------~--~----~ 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 -~----------~----~----~----~------~----~------~--~---
maybe a newbie question but what if I have a product ID and want to show current_stock in the different locations? On Feb 23, 5:01 pm, "Luke Ivers" <technod...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:> On 2/23/07, bitterbal <por...-kFg6fFbE636XDw4h08c5KA@public.gmane.org> wrote: > > > > > > > Hi, > > > I have 3 models > > > Product > > has_many :mutations > > > def current_stock > > <blablabla here I calculated the current stock of the product> > > end > > > Mutation > > belongs_to :product > > belongs_to :location > > > Location > > has_many :mutations > > > Question: > > > I can show the currect stock of a product with > > > product.current_stock > > > but how do a walk through all locations and show the different current > > stock of per location. I was thinkinf of using has many through and > > the use something like product.current_stock.locations.each etc. > > > But ofcourse that does not work. > > > Who can help ? > > Correct me if I''m wrong, but is this what you''re looking for? > > Product > has_many :locations, :through => :mutations > end > > Mutations > belongs_to :product > belongs_to :location > end > > Location > has_many :products, :through => :mutations > end > > product_stocks = Location.products.collect {|x| x.current_stock} > > If you need the name you could do something like > > Location.products.each { |product| products[product.name] > product.current_stock }--~--~---------~--~----~------------~-------~--~----~ 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 -~----------~----~----~----~------~----~------~--~---
First of all, I''m an idiot because I didn''t include something
necessary to
make it work
Both Product and Location should have has_many :mutations
Secondly, what you''re asking means you want to do something other than
what
you had in your original post: you want to have a current_stock for each
product <-> location relationship... that means current_stock should be
part
of the Mutation model.
If you want to keep a total current_stock for each product, and a seperate
one for each product at each location, then you would want to have
current_stock in Location be the sum of the stocks for all the locations,
which means your code should now look like:
class Location < ActiveRecord::Base
has_many :mutations
has_many :locations, :through => :mutations
def current_stock
Mutations.find_by_product_id(self.id).inject(0) {|total, location_stock|
total += location_stock.current_stock}
end
end
class Mutation < ActiveRecord::Base
belongs_to :location
belongs_to :product
def current_stock
# code to figure out current stock for this product/location
end
end
class Location < ActiveRecord::Base
has_many :mutations
has_many :products, :through => :mutations
end
On 2/23/07, bitterbal <portie-kFg6fFbE636XDw4h08c5KA@public.gmane.org>
wrote:>
>
> maybe a newbie question but what if I have a product ID and want to
> show current_stock in the different locations?
>
>
>
> On Feb 23, 5:01 pm, "Luke Ivers"
<technod...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:
> > On 2/23/07, bitterbal
<por...-kFg6fFbE636XDw4h08c5KA@public.gmane.org> wrote:
> >
> >
> >
> >
> >
> > > Hi,
> >
> > > I have 3 models
> >
> > > Product
> > > has_many :mutations
> >
> > > def current_stock
> > > <blablabla here I calculated the current stock of the
product>
> > > end
> >
> > > Mutation
> > > belongs_to :product
> > > belongs_to :location
> >
> > > Location
> > > has_many :mutations
> >
> > > Question:
> >
> > > I can show the currect stock of a product with
> >
> > > product.current_stock
> >
> > > but how do a walk through all locations and show the different
current
> > > stock of per location. I was thinkinf of using has many through
and
> > > the use something like product.current_stock.locations.each etc.
> >
> > > But ofcourse that does not work.
> >
> > > Who can help ?
> >
> > Correct me if I''m wrong, but is this what you''re
looking for?
> >
> > Product
> > has_many :locations, :through => :mutations
> > end
> >
> > Mutations
> > belongs_to :product
> > belongs_to :location
> > end
> >
> > Location
> > has_many :products, :through => :mutations
> > end
> >
> > product_stocks = Location.products.collect {|x| x.current_stock}
> >
> > If you need the name you could do something like
> >
> > Location.products.each { |product| products[product.name] > >
product.current_stock }
>
>
> >
>
--~--~---------~--~----~------------~-------~--~----~
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
-~----------~----~----~----~------~----~------~--~---
And if I weren''t an idiot, this would have said class Product instead of class Location at the top class Location < ActiveRecord::Base> has_many :mutations > has_many :locations, :through => :mutations > def current_stock > Mutations.find_by_product_id(self.id).inject(0) {|total, > location_stock| total += location_stock.current_stock} > end > end > >--~--~---------~--~----~------------~-------~--~----~ 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 -~----------~----~----~----~------~----~------~--~---
I guess I am not being clear on what I am looking for :-)
What I want is for a product X (example: 24710089) to show the
current_stock in all locations. Show I should get some array/hash that
allows me to output
Product 24710089
Location A: 10
Location C: 20
etc.
Based on examples above this is what I have implemented now:
class Product < ActiveRecord::Base
has_many :mutations
has_many :locations, :through => :mutations
def current_stock
Mutation.find_all_by_product_id(self.id).inject(0) {|total, mut|
total += mut.mutation}
end
end
class Mutation < ActiveRecord::Base
belongs_to :product
belongs_to :location
def mutation
mutation = 0 + self.buy - self.sell - self.transit - self.lost
end
end
class Location < ActiveRecord::Base
has_many :mutations
has_many :products, :through => :mutations
def current_stock
Mutation.find_all_by_location_id(self.id).inject(0) {|total,
mut| total += mut.mutation}
end
end
So the solution I am looking for should allow me to input the
product_id as the selection criteria then return all locations with
the current_stock value. Any tips ?
On Feb 23, 7:46 pm, "Luke Ivers"
<technod...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
wrote:> And if I weren''t an idiot, this would have said class Product
instead of
> class Location at the top
>
> class Location < ActiveRecord::Base
>
> > has_many :mutations
> > has_many :locations, :through => :mutations
> > def current_stock
> > Mutations.find_by_product_id(self.id).inject(0) {|total,
> > location_stock| total += location_stock.current_stock}
> > end
> > end
--~--~---------~--~----~------------~-------~--~----~
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
-~----------~----~----~----~------~----~------~--~---
On 2/25/07, bitterbal <portie-kFg6fFbE636XDw4h08c5KA@public.gmane.org> wrote:> > > I guess I am not being clear on what I am looking for :-) > > What I want is for a product X (example: 24710089) to show the > current_stock in all locations. Show I should get some array/hash that > allows me to output > > Product 24710089 > Location A: 10 > Location C: 20 > etc.Ahh... I thought you wanted to be able to have stock at each location, and then have the total stock (which is what product.current_stock does right now). I''m going to go ahead and leave that alone, and show you another function that will do what you want (that way you can do either one) class Product < ActiveRecord::Base> has_many :mutations > has_many :locations, :through => :mutations > > def current_stock > Mutation.find_all_by_product_id(self.id).inject(0) {|total, mut| > total += mut.mutation} > end > enddef location_stocks Mutation.find_all_by_product_id(self.id).each {|m| location_stock[ m.location_id] = m.mutation} location_stock end Now let''s say you have two locations, location1 and location2. location1''s id = 14839, current stock = 24 location2''s id = 19248, current stock = 94 If each of those locations had product 24710089 in it, and you did l = Product.find(24710089).location_stocks then l[14839] == 24 l[19248] == 94 Or, in Ruby parlance l == {14839 => 24, 19248 => 94} Will that do what you want? class Mutation < ActiveRecord::Base> belongs_to :product > belongs_to :location > > def mutation > mutation = 0 + self.buy - self.sell - self.transit - self.lost > end > end > > class Location < ActiveRecord::Base > has_many :mutations > has_many :products, :through => :mutationsYou probably don''t want current_stock here, unless you want it to show the stock of all the products at this location If you do, it''s: def current_stock Mutation.find_all_by_location_id(self.id).each {|m| product_stock[ m.product_id] = m.mutation} product_stock end This will be product_stock == {24710089 => 24} for location1 and product_stock == {24710089 => 94} for location2 end> > > So the solution I am looking for should allow me to input the > product_id as the selection criteria then return all locations with > the current_stock value. Any tips ? > > > > >--~--~---------~--~----~------------~-------~--~----~ 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 -~----------~----~----~----~------~----~------~--~---