Scaffold de tables SQL

Bonjour,

Voici le schéma de ma base SQL :

clients (0,) <---- (1,1) clients_produits (1,1) ----> (0,) produits

Pour créer un échafaudage rapide de mes tables, j’ai donc exécuté les
présentes commandes :

ruby script/generate scaffold client

ruby script/generate scaffold produit

Cependant, je ne sais pas quel commande exécuter pour obtenir la même
chose pour la 3ème table. Le problème, c’est que si j’entre
“client_produit”, Rails m’ajoutera un « s » à la fin (sans comprendre
qu’il s’agit d’une CIM (Contrainte d’Intégrité Multiple)) mais il n’y
aura pas de « s » à clientX_produits…

Bref, c’est un cas un peu ennuyeux et j’aimerais bien prendre la bonne
décision, afin que mon application puisse bien commencer, c’est à dire
sur la bonne voie :slight_smile:
A ce propos, j’ai nommé la table au centre d’après les conventions de
rails, en séparant le pluriel des 2 tables par un « _ », dans l’ordre
alphabétique.

Merci pour votre aide. Bonne soirée.

Merci pour ta réponse. Je débute et déjà , ça m’éclaire bcp. Après
réflexion, je vais opter pour la 1ère possibilité, qui à mon sens est
surement la moins compliqué :o)

J’aurai une dernière question à ce sujet sur une erreur qui surgit dès
que je génère le scaffold de ma table produits :

error Before updating scaffolding from new DB schema, try creating a
table for your model (Produit)

Pourtant, cette table est tt à fait normal, dans ma base MySQL. Voici sa
structure :

CREATE TABLE produits (
id int(11) NOT NULL auto_increment,
type varchar(32) NOT NULL default ‘’,
size int(11) NOT NULL default ‘0’,
expiration date NOT NULL default ‘0000-00-00’,
comment text NOT NULL,
block text NOT NULL,
PRIMARY KEY (id)
) TYPE=InnoDB AUTO_INCREMENT=2 ;

Si vous avez une idée, n’hésitez pas ^;^

t5in9tao a écrit :

Cependant, je ne sais pas quel commande exécuter pour
obtenir la même chose pour la 3ème table. Le problème,
c’est que si j’entre “client_produit”, Rails m’ajoutera un
« s » à la fin (sans comprendre qu’il s’agit d’une CIM
(Contrainte d’Intégrité Multiple)) mais il n’y
aura pas de « s » à clientX_produits…

2 possibilités :

  • tu tiens à avoir des associations habtm :
    client has_and_belongs_to_many :produits
    produit has_and_belongs_to_many :clients

tu as donc ta table de jointure clients_produits, mais
pas de modèle associé. 3 tables, 2 modèles, or
le scaffold concerne les modèles et non les tables.
Selon ce que tu souhaites faire, tu modifieras le code
du scaffold que tu as déjà généré pour pouvoir par exemple,
rajouter des produits quand on consulte une fiche client.

  • tu utilises à la place has_many :through, c’est à dire
    que ta table de jointure devient elle-même un modèle.
    Que ce soit ClientsProduit ou ClientProduit, c’est pas
    très sexy tout ça, autant choisir un nom qui reflète
    mieux ta logique métier.

Exemple :
class Client < AR::B
has_many :achats
has_many :produits, :through => :achats
end

class Produit < AR::B
has_many :achats
has_many :clients, :through => :achats
end

class Achat < AR::B
belongs_to :client
belongs_to :produit
end

tu as donc un modèle Achat, utilisable comme un autre modèle
et tant qu’Ã faire qui suit les conventions de Rails :
une clé primaire id, un nom de table achats, éventuellement
d’autres colonnes dans la table (et bien sûr les 2 clés
étrangères client_id, produit_id)

Donc comme t’as un modèle, tu peux faire un scaffold.
Bon maintenant, on est en 1.2.1, on peut faire mieux pour
pas beaucoup plus cher et être “restful” avec également
un scaffold adapté : scaffold_resource

ta ligne de commande pour Achat ressemblera par
exemple à :

$ script/generate scaffold_resource achat client_id:integer
produit_id:integer created_at:datetime

du même acabit pour Client et Produit.

Comble de la bravitude oops, de la paresse, t’auras
la ressource achat rajoutée automatiquement dans ton
config/routes.rb

Pour en savoir plus sur has_many :through (hmt),
pour une comparaison habtm versus hmt, voir le blog
http://blog.hasmanythrough.com

Bref, c’est un cas un peu ennuyeux et j’aimerais bien prendre
la bonne décision, afin que mon application puisse bien
commencer, c’est à dire sur la bonne voie :slight_smile:
A ce propos, j’ai nommé la table au centre d’après les
conventions de rails, en séparant le pluriel des 2 tables
par un « _ », dans l’ordre alphabétique.

Voilà ,

– Jean-François.

error Before updating scaffolding from new DB schema, try creating a
table for your model (Produit)

Il ne trouve pas la table, tu devrais plutôt utiliser les migrations
pour laisser Rails créer la table et t’assurer que tout est ok au niveau
accès à la base.

tu peux donc créer avec script/generate migration produits un squelette
dans db/migrate à remplir avec quelque chose comme ça (pas testé)

class AddProduits < ActiveRecord::Migration
def self.up
create_table :produits do |table|
table.column :type, :varchar, :default => “”, :null => false
table.column :size, :integer, :default => 0, :null => false
table.column :expiration, :date, :null => false
etc…
end
end

 def self.down
   drop_table :produits
 end

end

Voir la doc sur les migrations

Si vous avez une idée, n’hésitez pas ^;^
Je crois me souvenir par ailleurs qu’il n’est pas souhaitable d’utiliser
‘0000-00-00’ pour une date
date NOT NULL default ‘0000-00-00’
attention aussi au champ ‘type’ qui est réservé par Rails pour
l’héritage voir STI
http://wiki.rubyonrails.org/rails/pages/SingleTableInheritance