2010-04-05 7 views
1

Je crains vraiment les trouveurs de Rails en plus des plus évidents. Je recours toujours à SQL quand les choses deviennent plus avancées queRecherche avancée dans Rails

Model.find(:all, :conditions => ['field>? and field<? and id in (select id from table)', 1,2]) 

Je cette méthode:

def self.get_first_validation_answer(id) 
a=find_by_sql(" 
    select answers.*, answers_registrations.answer_text 
    from answers_registrations left join answers on answers_registrations.answer_id=answers.id 
    where 
    (answers_registrations.question_id in (select id from questions where validation_question=true)) 
    and 
    (sale_registration_id=#{id}) 
    limit 1 
").first 

a.answer_text || a.text if a 
end 

Quelqu'un peut-il créer une méthode de recherche qui me fait ce que je veux?

Cordialement,

Jacob

+0

Comment sont vos modèles définis? Quelles sont les associations (belongs_to, has_many, etc.)? –

+0

Pas une réponse, mais je vois que vous faites une interpolation variable dans votre appel find_by_sql pour placer l'ID en tant que paramètre à votre instruction where. Cette approche est sujette à l'injection SQL. Essayez d'utiliser les éléments suivants pour éviter cela: find_by_sql ['select ... where ... and sale_registration_id =?', Id] – Faisal

+0

Faisal> Je sais - J'ai modifié l'exemple et j'ai simplement choisi la méthode la plus simple. Merci pour le conseil, cependant. – jriff

Répondre

4
class AnswersRegistration < ActiveRecord::Base 
    has_many :answers 
end 

id = 123 
the_reg = AnswersRegistration.first(
    :joins => :answers, 
    :conditions => '(question_id in (select id from questions where validation_question = true)) and (sale_registration_id = ?)', id) 

(non testé)

+0

Merci - c'est comme Rails comme il obtient? Je n'ai aucun problème à le faire de cette façon - je pensais juste que l'on pouvait presque sans écrire de vrai SQL du tout. Vous venez de faire ": joins" - comment Rails sait-il qu'il devrait s'agir d'une jointure à gauche? – jriff

+0

Par défaut, ': joins' utilise une jointure interne. Pour faire une jointure à gauche, vous devez spécifier quelques sql: ': joins =>" left join réponses sur answers_registrations.answer_id = answers.id "' –

0

utiliser Juste joyau Searchlogic de binarylogic si cela répond à votre besoin. Ici, vous allez: http://github.com/binarylogic/searchlogic

+0

Merci pour votre réponse. Je sais qu'il y a des gemmes et des plugins qui peuvent aider, mais pour une raison quelconque, j'aime utiliser les trucs boursiers si possible - alors j'aimerais que la question originale soit résolue. – jriff

0

Parfois AR étoufferont les conditions imbriquées complexes, mais en théorie, vous devriez être en mesure de le faire:

AnswersRegistration.first(:conditions => { :question => { :validation_question => true }, 
              :sale_registration_id => id }, 
          :include => :answer)