2012-03-17 12 views
5

ho un modello come questo:Rails + MongoID - Interrogazione per attributo

class Lesson 
    include Mongoid::Document 

    field :title, :type => String 
    field :category, :type => String 
    field :price, :type => Float 
    field :description, :type => String 
    field :user_id, :type => String 


    validates_presence_of :title 
    validates_presence_of :category 
    validates_presence_of :price 
    validates_presence_of :user_id 

    attr_accessible :title, :category, :description, :price 

end 

e sto cercando di interrogare in questo modo:

@lessons_by_user = Lesson.find_by_user_id current_user.id 

E sto ottenendo:

metodo non definito `find_by_user_id 'per Lezione: Classe

Come posso eseguire una query in base a un attributo specifico in MongoID?

so come si fa in questo modo:

@lessons = Lesson.all(:conditions=>{:user_id=>current_user.id.to_s}) 

ma mi chiedo se c'è una scorciatoia ...

risposta

9

Mongoid non ha l'auto-creato metodi finder stile ActiveRecord, supporta solo un set limitato di predefined finder methods:

  • Model.all
  • Model.count
  • Model.exists?
  • Model.find
  • Model.find_or_create_by
  • Model.find_or_initialize_by
  • Model.first
  • Model.last

Tuttavia, esso ha un uso generale where method in modo da dire questo:

@lessons = Lesson.where(:user_id => current_user.id) 

where è chainable così (proprio come where nelle versioni più recenti di ActiveRecord) in modo da poter aggiungere altre condizioni o specificare l'ordinamento concatenando più criteri chiamate.

+0

impressionante. Davvero buono a sapersi. –

3

Dal momento che la versione 3.0.0 di Mongoid, si può anche fare:

@lessons = Lesson.find_by(user_id: current_user.id) 

Contrariamente a where, intende sollevare un'eccezione Mongoid::Errors::DocumentNotFound se la richiesta non restituisce alcun risultato. È il comportamento predefinito, ma se si imposta l'opzione di configurazione raise_not_found_error su false, in questo caso verrà restituito nil. Fonte

: http://mongoid.org/en/mongoid/docs/querying.html

+1

Grazie per le correzioni dei documenti "2 vs 3" sopra. Anche AR si sta muovendo verso 'find_by' invece di tutta quella roba' find_by_user_id' in 'method_missing'. –

Problemi correlati