2010-06-30 6 views
0

Comment modifier le comportement par défaut du modèle activerecord pour la méthode find? Par exemple, je veux chercher tous les livres à l'intérieur base de données nœuds drupal, mais drupal utilise une seule table pour toutes les données, et utilise la colonne « type » pour trouver le typeCréation d'un modèle AR pour la base de données Drupal

class Book < ActiveRecord::Base 
    set_table_name 'node' 

    def find(*args) 
    :conditions => {:type => 'book'} 
    super 
    end 
end 

c'est la bonne approche pour résoudre ce problème?

+0

Utilisez-vous CCK (kit contstruction contenu , également connu sous le nom content.module)? Dans ce cas vos tables seront beaucoup plus dynamiques même. – berkes

+0

oui, il y a des champs cck dans ce type de noeud. Mais par exemple, j'essayais juste d'obtenir les noeuds du livre. Je projetais d'écrire un plugin de rails, quelque chose comme acts_as_drupal_node – vrsmn

Répondre

1

J'ai résolu ce problème la création d'un modèle pour le nœud et en utilisant named_scopes

le résultat est cette

class Node 
    set_table_name 'node' 
    set_primary_key 'nid' 
    named_scope :book, :conditions => {:type => 'book'} 

    # if i don't overwrite this method, i would get an error when i try to use the type column 
    def self.inheritance_column 
    "rails_type" 
    end 
end 

cela fonctionne, mais ne ressemble pas à les rails de façon à faire des choses. Si je reçois le temps enought bientôt, je vais essayer d'écrire une bibliothèque pour accéder aux données drupal utilisant quelque chose comme acts_as_drupal_node

maintenant je peux chercher toutes les entrées du livre en utilisant:

@books = Node.book.all 
+0

Dans votre cas, j'utiliserai ** books ** comme nom de portée, et dans Rails 3 vous pouvez utiliser 'scope' et non pas' named_scope' –

Questions connexes