2010-12-11 31 views
2

Je les modèles suivants:Question Basic Rails - Comment créer une nouvelle entrée dans la base de données?

Product: name, shop_id (foreign key), brand_id (foreign key), price 
Shop: name 
Brand: name 

Les associations sont:

Product: belongs_to :shop 
     belongs_to :brand 
Shop: has_many :products 
     has_many :brands, :through => :products 
Brand: has_many :products 
     has_many :shops, :through => :products 

Question 1

ces associations sont-sens? Souhaitez-vous ajouter d'autres associations?

Question 2

Je voudrais pré-remplir la base de données en db/seeds.db.

Pour ajouter un Shop ou un Brand que je fais:

Shop.create(:name => shop_name) 
Brand.create(:name => brand_name) 

Quelle serait la meilleure façon d'ajouter un Product? Ai-je vraiment besoin d'insérer manuellement les valeurs shop_id et brand_id? Si le magasin et la marque du produit nouvellement créé n'existent pas encore, seront-ils ajoutés automatiquement à la base de données?

Répondre

5

l'idée générale avec les associations que vous faites est de le faire:

shop = Shop.create(:name => shop_name) 
shop.brands << Brand.create(:name => brand_name) 

Ou l'inverse. Vous n'avez pas à créer manuellement le modèle de jointure si vous ne le souhaitez pas.

Editer: Voici une démonstration concernant votre commentaire ci-dessous.

Configurer les migrations.

$ ./script/rails g model Shop name:string 
$ ./script/rails g model Brand name:string 
$ ./script/rails g model Product brand_id:integer shop_id:integer 
$ rm test/fixtures/* 

$ rake db:migrate; rake db:test:prepare 

Les modèles.

class Brand < ActiveRecord::Base 
    has_many :products 
    has_many :shops, :through => :products 
end 

class Shop < ActiveRecord::Base 
    has_many :products 
    has_many :brands, :through => :products 
end 

class Product < ActiveRecord::Base 
    belongs_to :brand 
    belongs_to :shop 
end 

Le test. Notez qu'aucune ligne de code ne crée explicitement un produit. Quels sont les cas d'utilisation lorsque l'opérateur doit insérer des identifiants manuellement?

require 'test_helper' 

class ShopTest < ActiveSupport::TestCase 

    def test_brand_assignment_to_shop 
    assert_equal 0, Product.count 

    shop = Shop.create(:name => "Foo Shop") 
    brand = Brand.create(:name => "Foo Brand") 
    shop.brands << brand 

    assert_equal 1, Product.count 
    assert_equal shop.id, Product.first.shop_id 
    assert_equal brand.id, Product.first.brand_id 
    end 
end 



$ ruby -I./test test/unit/shop_test.rb 
Loaded suite test/unit/shop_test 
Started 
. 
Finished in 0.029778 seconds. 

1 tests, 4 assertions, 0 failures, 0 errors 
+0

Merci, mais la question principale était sur l'insertion d'un 'Product' ... –

+1

Avez-vous l'essayer? L'insertion de produits est exactement ce que ce code va faire. – jdl

+0

Merci pour vos efforts! Je ne comprends pas pourquoi 'shop.brands << marque' ajoute un produit. Pourriez-vous élaborer? Comment définiriez-vous le «nom» et le «prix» de ce produit? –

1

Lorsque vous créez le modèle de produit, selon ce que les associations ont raison.

Vous pouvez également utiliser accepts_nested_attributes_for qui vous permet d'enregistrer des attributs sur des enregistrements associés via le parent.

Pour la graine, je pense que oui vous avez insérer manuellement shop_id et brand_id. Ceux-ci peuvent se faire comme suit:

@shop = Shop.create(:name => shop_name) 
@brand = Brand.create(:name => brand_name) 

Product.create(:shop_id => @shop.id , :brand_id => @brand.id) 

Gardez à l'esprit que le premier parent doit être créé alors l'enfant ainsi, tout en insérant les données d'abord créer la boutique et la marque puis créer des produits

Hope, cette pourrait résoudre votre problème

+0

Pour autant que je puisse le suggérer, 'accepte_nested_attributes_for' fera l'affaire. –

+0

En fait, les attributs de la marque ne sont pas transmis dans la boutique, donc accept_nested_attributes_for ne fonctionnera pas. Si vous transmettez les données de la marque dans la boutique, alors via accepts_nested_attributes_for va créer une association entre la marque et la boutique – Srushti