2009-03-10 11 views
3

J'ai un tableau ActiveRecord contenant une liste de magasins. Je souhaite supprimer un enregistrement de magasins sans le supprimer de la base de données.Supprimer uniquement de la mémoire et non de la base de données

shops.delete(a_shop) entraînerait une requête SQL de suppression. Je veux juste que la boutique soit supprimée du tableau ActiveRecord mais pas de la base de données.

Est-ce que cela peut être fait?

Merci

Répondre

9

Attention si vous utilisez relation has_many la réponse par JP ne fonctionnera pas.

Extension de l'exemple:

class City < ActiveRecord::Base 
    has_many :shops 
end 

city = City.find(:name => "Portland") 

puis

city.shops.delete(city.shops[0]) 

Est-ce que supprimer de la DB!

également

theshops = city.shops 
theshops.delete(ss[0]) 

Est-ce que supprimer de la DB

Une façon de se détacher de la base de données est d'utiliser compact ou une autre fonction de tableau comme ceci:

theshops = city.shops.compact 
theshops.delete(ss[0]) 

Will pas supprimer de la base de données

En outre, dans tous les cas delete_if Ne supprimer de la db:

city.shops.delete_if {|s| s.id == city.shops[0]} 

Cheers! N'oubliez pas: Si vous avez des doutes sur ce genre de choses, le script/la console est votre ami (e)!

1

Je ne pense pas que vous pouvez supprimer l'élément du tableau. Toutefois, vous devriez pouvoir modifier votre recherche pour retourner la matrice sans cette boutique au départ. Quelque chose comme:

shops = Shop.find(:all, :conditions => "id NOT #{a_shop.id}") 

devrait être dans le sens de ce que vous voulez. De cette façon, vous n'obtenez jamais la boutique dans le conteneur en premier lieu, mais cela n'affecte pas la base de données.

+0

Cela fonctionne une fois, mais si plus d'un magasin doit être retiré, vous aurez à faire autre chose. Et vous pouvez supprimer des éléments de la matrice. – Tilendor

5

Lorsque j'ai effectué des tests, l'appel de la méthode delete ne supprime pas réellement l'élément de la base de données. Seulement à partir du tableau.

shops = Shop.find(:all) 
shops.delete(shops[0]) #deletes the first item from the array, not from the DB 

Pour supprimer de la DB:

shops = Shop.find(:all) 
Shop.delete(shops[0].id) 

Voir la distinction? Au moins, comment cela fonctionne sur mon installation de Rails 2.1.

-JP

0

Je voudrais suggérer une telle manière de supprimer l'objet AR dans la mémoire.
Ajouter un attribut au modèle approprié qui est responsable du marquage objet AR comme supprimé (par exemple deleted attribut):

classe OrderItem < ActiveRecord :: Base ... attr_accessor: supprimé

def deleted 
    @deleted || 'no' 
end 

fin

Mark l'objet approprié comme supprimé:

o.order_items {|oi| oi.deleted = 'yes' if oi.id == 1029} 

Filter ordre_items réglables uniquement non lignes supprimées:

o.order_items do |oi| 
unless oi.deleted == 'yes' 
... 
end 
end 
Questions connexes