Hello! I have a legacy DB and want to use ActiveRecord for it. However, I can''t set up a relation correctly. Here''s table spec: [products] id name price [subproducts] product_id subproduct_id Some example data: [products] 1, "Computer", 500.00 2, "Monitor", 200.00 3, "Printer", 100.00 4, "System", 700.00 5, "System2", 650.00 "System" is made up of "Computer", "Monitor", and "Printer" "System2" is made up of "Computer" and "Printer" So [subproducts] table will have the following rows. 4, 1 4, 2 4, 3 5, 1 5, 2 "Computer" can be sold by itself or as a part of "System". class Product < ActiveRecord::Base #??? end How do I set up relations? It seems like a many-to-many relation. But I''m stuck here. Thansk. Sam -- Posted via http://www.ruby-forum.com/.
First thing I would do is try this:
class Product < ActiveRecord::Base
has_many :subproducts
end
class Subproduct < ActiveRecord::Base
belongs_to :product
set_primary_key "subproduct_id"
end
Now I don''t know what subproducts are but I assume that
''product_id''
is the parent id and subproduct_id is the primary key of the table but
a foreign key to the actual product itself.
That gets tricky but not really impossible.
p = Product.find(1)
new_product = Product.create :name=>"Computer", :price=>500
p.subproducts << SubProduct.create :subproduct_id =>new_product.id
And you could pretty that up by making your own add_subproduct method
on your model. A rushed and untested example might be this:
class Product < ActiveRecord::Base
has_many :subproducts
def add_subproduct(product_id)
self.subproducts << Subproduct.create :subproduct_id => product_id
end
def remove_subproduct(product_id)
self.subproducts.remove(product_id)
end
end
p = Product.find(1)
s = Product.find(2)
p.add_subproduct s.id
p.remove_subproduct s.id
Would that work?
On 5/19/06, Sam Kong <sam.s.kong@gmail.com> wrote:> Hello!
>
> I have a legacy DB and want to use ActiveRecord for it.
> However, I can''t set up a relation correctly.
>
> Here''s table spec:
>
> [products]
> id
> name
> price
>
> [subproducts]
> product_id
> subproduct_id
>
>
> Some example data:
>
> [products]
> 1, "Computer", 500.00
> 2, "Monitor", 200.00
> 3, "Printer", 100.00
> 4, "System", 700.00
> 5, "System2", 650.00
>
> "System" is made up of "Computer", "Monitor",
and "Printer"
> "System2" is made up of "Computer" and
"Printer"
>
> So [subproducts] table will have the following rows.
>
> 4, 1
> 4, 2
> 4, 3
> 5, 1
> 5, 2
>
> "Computer" can be sold by itself or as a part of
"System".
>
> class Product < ActiveRecord::Base
> #???
> end
>
> How do I set up relations?
> It seems like a many-to-many relation.
> But I''m stuck here.
>
> Thansk.
> Sam
>
>
>
>
> --
> Posted via http://www.ruby-forum.com/.
> _______________________________________________
> Rails mailing list
> Rails@lists.rubyonrails.org
> http://lists.rubyonrails.org/mailman/listinfo/rails
>
Hi, Brian, Thank you for the answer. I need to make one thing clear. subproducts table is just a join table which doesn''t have a primary key(id). See the example data for subproducts. product_id, subproduct_id 4, 1 4, 2 4, 3 5, 1 5, 2 subproduct_id can''t be a primary_key just by itself. Primary key would be the composite of product_id and subproduct_id. This is a many-to-many relation. But the difference is that this relation is between one table instead of two. Usually a many-to-many is like between student-to-class. But my case is like product-to-product. What do you think? Sam -- Posted via http://www.ruby-forum.com/.
Brian Hogan
2006-May-19 19:10 UTC
[Rails] Re: How can I set up relations for these models?
Do you mean to say that it is possible for a subproduct to belong to more than one product? Cos that''s what this implies. That''s easy though... you should look here: http://rails.techno-weenie.net/tip/2006/4/12/self_referential_many_to_many_relationships That will do it for you then! On 5/19/06, Sam Kong <sam.s.kong@gmail.com> wrote:> Hi, Brian, > Thank you for the answer. > > I need to make one thing clear. > > subproducts table is just a join table which doesn''t have a primary > key(id). > See the example data for subproducts. > > product_id, subproduct_id > 4, 1 > 4, 2 > 4, 3 > 5, 1 > 5, 2 > > subproduct_id can''t be a primary_key just by itself. > Primary key would be the composite of product_id and subproduct_id. > > This is a many-to-many relation. > But the difference is that this relation is between one table instead of > two. > > Usually a many-to-many is like between student-to-class. > But my case is like product-to-product. > > What do you think? > > Sam > > -- > Posted via http://www.ruby-forum.com/. > _______________________________________________ > Rails mailing list > Rails@lists.rubyonrails.org > http://lists.rubyonrails.org/mailman/listinfo/rails >
Sam Kong
2006-May-19 19:54 UTC
[Rails] Re: Re: How can I set up relations for these models?
Oh, I think that it''s exactly what I want. Thanks! Sam -- Posted via http://www.ruby-forum.com/.
Josh Susser
2006-May-19 20:00 UTC
[Rails] Re: Re: How can I set up relations for these models?
Sam Kong wrote:> Oh, I think that it''s exactly what I want. > Thanks!That should work fine if all you need is a join table. If you want to keep additional attributes in the subproducts table (like maybe number of units?), you''ll want to use a self-referential join model. http://blog.hasmanythrough.com/articles/2006/04/21/self-referential-through -- Josh Susser http://blog.hasmanythrough.com -- Posted via http://www.ruby-forum.com/.
Sam Kong
2006-May-19 23:50 UTC
[Rails] Re: Re: How can I set up relations for these models?
Josh Susser wrote:> Sam Kong wrote: >> Oh, I think that it''s exactly what I want. >> Thanks! > > That should work fine if all you need is a join table. If you want to > keep additional attributes in the subproducts table (like maybe number > of units?), you''ll want to use a self-referential join model. > > http://blog.hasmanythrough.com/articles/2006/04/21/self-referential-throughWow, how did you know that? I need additional attributes in the subproducts table. I was thinking about it and you already answered. Thank you so much. Sam -- Posted via http://www.ruby-forum.com/.
Josh Susser
2006-May-20 07:03 UTC
[Rails] Re: Re: How can I set up relations for these models?
Sam Kong wrote:> Wow, how did you know that? > I need additional attributes in the subproducts table. > I was thinking about it and you already answered.I''ve been answering questions on this list for a while. I guess I''m learning what usually comes next :-) cheers! -- Josh Susser http://blog.hasmanythrough.com -- Posted via http://www.ruby-forum.com/.