2010-08-08 4 views
1

Cette question s'adresse aux débutants mais, pour une raison quelconque, je ne trouve pas la réponse ailleurs. Je suis dans client/show.html.erb et je veux que mon client manipule order_items.Utilisation d'informations imbriquées dans le contrôleur/les vues

De nombreuses commandes ont beaucoup ordre_items et je veux rechercher TOUS ces ordre_items pour trouver ceux tels que lire == false.

#controller 
@customer = Customer.find(params[:id]) 
@orders = @customer.orders 

@order_items = @ orders.order_items ne fonctionne pas. Étant donné que j'ai plusieurs éléments dans @orders, comment puis-je collecter tous les items de commande appartenant à @orders?

=== === EDIT

Ma structure entière de la base de données est un grand groupe complexe de tables et je dois parcourir cet arbre pour ce point de vue particulier.

customer has_many orders 
orders has_many order_items 
order_items belongs_to category 

Comment, par exemple, trouve le nombre de ordre_items de mon client qui appartiennent à la catégorie X?

Dernière question: pourquoi ne pas @ orders.find_all_by_x (...) travailler?

Répondre

0

1) Afficher tous OrderItems pour un client

Vous pouvez ajouter une relation appelée "ordre_items" à votre client comme ceci:

has_many :order_items, :through => :orders 

Vous pouvez alors faire:

customer = Customer.find(:first) 
order_items = customer.order_items 

Pour trouver tous les OrderItems non lus (où lecture == false), vous pouvez ajouter à votre named_scope OrderItem:

named_scope :unread, :conditions => {:read => false} 

alors vous pouvez trouver tous OrderItems non lus pour un client par:

customer.order_items.unread 

2) Voir tous les OrderItems d'un client appartenant à une catégorie donnée

Encore une fois, un champ nommé dans OrderItem (je suppose OrderItem belongs_to Catégorie):

named_scope :in_category, lambda { |name| 
    {:conditions => {:categories => {:name => name}}, :include => :category} 
} 

Deux Notes:

  1. Vous devez inclure: catégorie dans la conditon

  2. même si sa belongs_to: catégorie (singulier), vous devez utiliser: catégories (au pluriel). C'est parce que: include ajoute la table au pluriel. (Je ne sais pas pourquoi il le fait, et pour moi cela semble être une allusion au fait que ce n'est pas la meilleure solution.)

Dernière question: pourquoi ne pas @ orders.find_all_by_x (. ..) travail?

Cela fonctionne comme prévu pour moi. Quel message d'erreur obtenez-vous?

+0

Pour la partie 1: Alors que le client a_many: order_items,: through =>: orders, I ne peut pas dire que OrderItem has_many: customers,: through =>: orders. Ma table de commande a certainement seulement l'ID customer_id et NOT order_item. Pouvez-vous avoir un one-way has_many à travers? – sscirrus

+0

peut-être vous avez besoin has_one: à travers – Bohdan

+0

@sscirrus: Bohdan a raison, vous pouvez utiliser has_one: client,: through =>: order – Calavera

0

Salut @orders = @customer.orders vous donne une collection de ActiveRecord objets Vous ne pouvez pas appeler les méthodes d'un objet sur cette collection Vous devez utiliser each iterator

#controller 
@customer = Customer.find(params[:id]) 
@orders = @customer.orders 
list = Array.new() 
@orders.each do |order| 
    //some your action(something like order.order_items) 
    //you may add some condition here 
    order.order_items.each do |item| 
    list << item 
    end 
end 

recherche Maintenant, je ne suis pas shure au sujet count mais il peut travailler

OrderItem.find(:all,:conditions => {:category_id => "1"}).count //if you know category id 

ou

OrderItem.all :joins => :categories, :conditions => {:categories => {:name => "X"}} //name is column in your table which holds category name 

et le dernier

Pour chaque domaine (aussi connu sous le nom d'un attribut) que vous définissez dans votre table, Active Record fournit une méthode de recherche. Si vous avez un champ appelé nom sur votre modèle client par exemple, vous obtenez gratuitement find_by_name et find_all_by_name de Active Record. Si vous avez également un champ verrouillé sur le modèle Client, vous obtenez également find_by_locked et find_all_by_locked.

Vous ne pouvez pas appeler @orders.find_all_by_x(...) mais vous pouvez appeler Category.find_all_by_name("X")

+0

Salut Bohdan, J'aurais utilisé .each, sauf que j'ai besoin de TOUS les order_items ensemble pour que je puisse les trier ... en utilisant .each contraint naturellement la commande. – sscirrus

+0

Si vous devez collecter tout ce que vous devez utiliser << opérateur – Bohdan

+0

vous pouvez écrire même liste << order.order_items mais vous obtiendrez alors un autre résultat – Bohdan

Questions connexes