Fonction pour un model

Salut à tous,

J’ai un model item(id,quantity,price)

et je voudrais faire une fonction qui fasse:

item.sum qui renvoie quantity*price

j’ai pensé à faire ça:
def sum
quantity*price
end

mais je ne sais pas trop ou la mettre, item_helper je suppose?
aussi est-ce qu’il n’y aurait pas mieux genre les fonctions self? ou
un truc comme ça.

Merci d’avance

Pat

Patrick :

mais je ne sais pas trop ou la mettre, item_helper je suppose?

Dans ton modèle, app/models/item.rb

aussi est-ce qu’il n’y aurait pas mieux genre les
fonctions self?

“Les fonctions self”, c’est-Ã -dire ?

ou un truc comme ça.

mmmh… tu viens de PHP ou Java ? :slight_smile:

-- Jean-François.

On 1/9/07, Jean-François [email protected] wrote:

end

mais je ne sais pas trop ou la mettre, item_helper je suppose?

Dans ton modèle, app/models/item.rb
ok merci

aussi est-ce qu’il n’y aurait pas mieux genre les
fonctions self?

“Les fonctions self”, c’est-à-dire ?

ou un truc comme ça.

J’ai rien dit :slight_smile:

au fait tu sais comment on fait pour insérer des valeurs à partir de
migration?
J’éssayer ça mais c’est pas bon:

class CreateItems < ActiveRecord::Migration
def self.up
create_table :items do |t|
t.column ‘price’, :string, :limit => 30
t.column ‘description’, :text
t.column ‘quantity’, :int
t.column ‘invoice_id’, :int
end

end
Item.create(:price=>‘123’,:description=>‘nice
item’,:quantity=>‘3’,:invoice_id=>1)
Item.create(:price=>‘54’,:description=>‘bad
item’,:quantity=>‘2’,:invoice_id=>1)
Item.create(:price=>‘15’,:description=>‘cool
item’,:quantity=>‘4’,:invoice_id=>2)
def self.down
drop_table :items
end
end

voilà l’erreur:
Mysql::Error: #42S02Table ‘invoiceapp_development.items’ doesn’t
exist: SHOW FIELDS FROM items

Patrick :

    t.column 'invoice_id', :int
end

end
Item.create(:price=>‘123’,:description=>‘nice
item’,:quantity=>‘3’,:invoice_id=>1)
Item.create(:price=>‘54’,:description=>‘bad item’,:quantity=>‘2’,:invoice_id=>1)
Item.create(:price=>‘15’,:description=>‘cool
item’,:quantity=>‘4’,:invoice_id=>2)

Réponse express sans examen très approfondi, mets tes Item.create()
dans la méthode de classe up, sinon Ruby va exécuter ses ordres en
parsant ta classe, donc avant d’appeler CreateItems.up, donc
avant la création de la table items.

-- Jean-François.

trouvé:items.inject(0) {|sum,b| sum + b.sum}

j’éssais de faire la même chose avec les invoices, pour chaque invoice
je veux calculer la somme de chacune des sommes de chaque items.

donc dans mon model/invoice.rb j’ai mis:

def sum
items.inject {|a,b| a.sum + b.sum}
end

dans mon list.rhtml je fais
<% for inv in @invoices %>
<%= inv.sum %>
<% end %>

ça marche quand un invoice a deux items ou plus mais quand un invoice
a un seul item ça me revoie le item donc # sur le list.rhtml. Est-ce
qu’il y a un moyen de faire marcher inject quand un invoice a qu’un
seul item?

Merci d’avance

Pat

Essaye ça :

items.inject(0) {|sum_total, item| sum_total += item.sum}

Mathieu

On 1/10/07, Patrick A. [email protected] wrote:

<% for inv in @invoices %>
Pat


Railsfrance mailing list
[email protected]
http://lists.rubyonrails.fr/mailman/listinfo/railsfrance


Mathieu Fosse

http://blog.kawooa.org
http://www.ziki.com/people/pointcom

Oups, il se fait tard. J’vais me coucher :

items.inject(0) {|sum_total, item| sum_total + item.sum}

Bonne nuit !

On 1/10/07, Mathieu FOSSE [email protected] wrote:

j’éssais de faire la même chose avec les invoices, pour chaque invoice
<%= inv.sum %>


http://www.ziki.com/people/pointcom


Mathieu Fosse

http://blog.kawooa.org
http://www.ziki.com/people/pointcom

On 1/10/07, Jean-François [email protected] wrote:

(ça a marché la migration finalement ?)

non ça fait la même erreur:
Mysql::Error: #42S02Table ‘invoiceapp_development.items’ doesn’t
exist: SHOW FIELDS FROM items

c’est bon merci ça marche. il y avait un typo dans le nom de ma
colonne :confused: désolé

Pat

Patrick :

c’est bon merci ça marche. il y avait un typo dans le nom de ma
colonne :confused: désolé

Ok.
J’utilise jamais :int avec t.column, ça marche ça ? t.column :quantity,
:int

– Jean-François.

Pat:

j’éssais de faire la même chose avec les invoices, pour
chaque invoice je veux calculer la somme de chacune des
sommes de chaque items.

donc dans mon model/invoice.rb j’ai mis:

def sum
items.inject {|a,b| a.sum + b.sum}
end

Non, ça marchera pas comme ça, le premier paramètre
de ton block doit être l’accumulateur, ici la somme partielle.
Et tu pars de 0 :

items.inject(0) { |acc,e| acc + e.sum }

dans mon list.rhtml je fais
<% for inv in @invoices %>
<%= inv.sum %>
<% end %>

ça marche quand un invoice a deux items ou plus

T’es sûr que ça marche avec 3 items ? Moi pas.

mais quand un invoice a un seul item ça me revoie le item
donc # sur le list.rhtml. Est-ce qu’il y a un moyen de faire
marcher inject quand un invoice a qu’un seul item?

Cf plus haut. et ri inject pour les explications.

(ça a marché la migration finalement ?)

– Jean-François.

Patrick :

J’utilise jamais :int avec t.column, ça marche ça ? t.column :quantity, :int

oui, ca me créer un int(11). Sinon tu fais comment toi? :slight_smile:

:integer
t.column :quantity, :integer

Vois même pas où :int est documenté dans l’API.

– Jean-François, searching…

On 1/10/07, Jean-François [email protected] wrote:

Patrick :

c’est bon merci ça marche. il y avait un typo dans le nom de ma
colonne :confused: désolé

Ok.
J’utilise jamais :int avec t.column, ça marche ça ? t.column :quantity, :int

oui, ca me créer un int(11). Sinon tu fais comment toi? :slight_smile:

ma pomme :

J’utilise jamais :int avec t.column, ça marche ça ?
t.column :quantity, :int

oui, ca me créer un int(11). Sinon tu fais comment toi? :slight_smile:

:integer
t.column :quantity, :integer

Vois même pas où :int est documenté dans l’API.

Ouais. :integer est plus sûr d’un point de vue db-agnostique.

– Jean-François.