2010-04-14 15 views
0

J'ai deux modèles Bibliothèque et Livre. Dans mon modèle de bibliothèque, j'ai un tableau - book_ids. La clé primaire du modèle Book est ID. Comment créer une relation has_many: books dans mon modèle de bibliothèque?Associations de modèles

Il s'agit d'une base de données existante que nous utilisons avec des rails.

Merci.

+1

Comment placer un tableau de n'importe quoi dans une colonne de base de données? –

+0

Il est stocké sous forme de chaîne "[3,4,5]" –

Répondre

1

Votre schéma de base de données ne se conforme pas vraiment avec les conventions Rails prescrits et vous aurez probablement une difficile de faire le travail par défaut has_many par défaut. Avez-vous essayé de jouer avec les options SQL personnalisées avec pensée?

Si vous ne parvenez pas à faire fonctionner l'association has_many intégrée, vous devrez créer la vôtre. Je définirais les méthodes books et books= sur votre modèle de bibliothèque et, à l'intérieur, définirais un attribut virtuel, que vous enregistreriez ensuite en tant que tableau dans la base de données. Peut-être quelque chose comme ceci:

class Book > ActiveRecord::Base; end 

class Library > ActiveRecord::Base 

    before_save :serialize_books 

    def books 
    @books || nil 
    end 

    def books=(new_books) 
    @books = new_books 
    end 

    private 
    def serialize_books 
    @attributes['books'] = "[" + @books.collect {|b| b.id }.join(',') + "]" 
    end 
end 

que jusqu'à il n'y aurait pas retirer le dataIf vous vouliez aller encore plus Gung Ho et de soutenir seule requête trouver des opérations, vous pouvez utiliser certaines fonctions SQL personnalisée dans un champ ou passer outre trouver et ajoutez-le aux options par défaut. Commentez si vous voulez de l'aide pour tout ça!

0

Si vous souhaitez utiliser has_many, vous pouvez utiliser les options: counter_sql et: finder_sql en utilisant la syntaxe MySQL LIKE ou REGEX. Mais il est probablement préférable de charger d'abord le modèle Libary, puis d'analyser la colonne book_ids et de charger les livres, ou de construire directement une requête avec cette chaîne.