2012-06-20 11 views
14

persone Sto cercando di utilizzare la registrazione attiva senza binari e non riesco a far funzionare has_many correttamente. Non ho mai provato a utilizzare la registrazione attiva senza binari. Posso interrogare da tabelle singole ma le relazioni non sembrano funzionare. Qualcuno potrebbe dare una rapida occhiata e vedere se mi manca qualcosa. Qui è lo stubCome utilizzare la registrazione attiva senza binari

#!/usr/bin/ruby 

require 'rubygems' 
gem 'activerecord' 

require 'sqlite3' 
require 'active_record' 

ActiveRecord::Base.establish_connection(
    :adapter => 'sqlite3', 
    :database => 'test.db' 
) 

class User < ActiveRecord::Base 
    has_many :problems 
end 

class Problem < ActiveRecord::Base 
    belongs_to :users 
end 

def show_single_item 
    pr = Problem.find(:first) 
    puts "showing first problem from the db below", pr.desc 
end 

def show_all_items 
    pr = Problem.find(:all) 
    puts "showing all problems from the db below" 

    pr.each do |a| 
    puts a.desc 
    end 
end 

def check_has_many 
    user = User.find(:first) 
    puts user.problem.desc 
end 

# run some methods 
show_single_item # works 
show_all_items # works 
check_has_many # not working 


------ 

here is the schema of users and problems from the database 

sqlite> .schema users 
CREATE TABLE "users" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "first_name"  varchar(255), "last_name" varchar(255)); 

sqlite> .schema problems 
CREATE TABLE "problems" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "user_id" integer, "desc" varchar(255)); 

and some selects to show some data from the tables 

sqlite> select * from users; 
2|mike|smit 
3|mike|wilson 

sqlite> select * from problems; 
1||first problem 
2||it went 
3||this is a new problem 
4||some more junk data 

e qui è l'errore

ruby-1.8.7-p352/gems/activemodel-3.2.3/lib/active_model/attribute_methods.rb:407:in `method_missing': \ 
undefined method `problem' for #<User id: 2, first_name: "mike", last_name: "smit"> (NoMethodError) 
     from /home/wileybd/.rvm/gems/ruby-1.8.7-p352/gems/activerecord-3.2.3/lib/active_record/attribute_methods.rb:148:in `method_missing' 
     from ./main.rb:38:in `check_has_many' 
     from ./main.rb:44 

qualsiasi aiuto sarebbe apprezzato.

+0

Se si sta eseguendo il record attivo 3.2.3 (sembra che sia così), consiglierei l'aggiornamento di ruby ​​da 1.8.7 a 1.9.3 usando RVM –

risposta

2

Lo stacktrace specificato indica esattamente l'errore. E 'nel metodo check_has_many:

def check_has_many 
    user = User.find(:first) 
    puts user.problem.desC# <==== should be user.problems 
end 

tuo manuale ha problemi MOLTI, quindi deve essere plurale:

def check_has_many 
    user = User.find(:first) 
    puts user.problems.first.desC# <==== do this instead 
end 

Inoltre, il belongs_to: rapporto utenti nel modello di problema, dovrebbe essere singolare:

class Problem < ActiveRecord::Base 
    belongs_to :user # <=== singular, not :users 
end 
+0

scusa avrei dovuto mostrare come ho provato anche quello, ma l'ho cambiato torna a ciò che hai appena postato e qui c'è l'errore ora – user740970

+0

.rvm/gems/ruby-1.8.7-p352/gems/activerecord-3.2.3/lib/active_record/relation/delegation.rb: 45: in "method_missing" : metodo non definito 'desc 'per []: ActiveRecord :: Relation (NoMethodError) da /home/wileybd/.rvm/gems/ruby-1.8.7-p352/gems/activerecord-3.2.3/lib/active_record/associations /collection_proxy.rb:100:in 'invia ' da /home/wileybd/.rvm/gems/ruby-1.8.7-p352/gems/activerecord-3.2.3/lib/active_record/associations/collection_proxy.rb:100 : in 'method_missing ' da ./main.rb:38:in' check_has_many' da ./main.rb:44 – user740970

+0

quindi immagino che il respond_to non si sia verificato con quel metodo? – user740970

6

Penso di sapere cosa stai cercando di fare. Se non sbaglio, vuoi visualizzare il valore di desc di ogni problema per un dato utente.

Un modo semplice per realizzare ciò che vi serve è una combinazione dei vostri ultimi 2 metodi:

user = User.first 
user.problems.each do |pr| 
    puts pr.desc 
end 

Il problema riscontrato nel codice è che semanticamente si sta dicendo qualcosa come "visualizzare la descrizione del problema (si noti che è singolare) dell'utente" invece di dire 'visualizzare la descrizione di ogni problema l'utente ha', che se fosse possibile, dovrebbe essere qualcosa di simile:

puts user.problems.descs # This will not work 

Ma non è solo il modo Funziona. C'è, però, un new method che si potrebbe usare:

puts user.problems.pluck(:desc) 

Questo metodo produrrà una matrice del valore disc di ogni problema per l'utente. Probabilmente puoi giocare con l'output per farlo stampare come preferisci.

+1

+1 per pluck - Nota: disponibile dal 3.2.1+ –

+0

pepe, grazie sono stato in grado di far funzionare tutto ora. Inoltre ho dimenticato di nuovo che stavo recuperando una collezione. Neanche io sapevo di cogliere, grazie ancora. – user740970

+0

@ user740970 Prego. Sono contento di poter essere d'aiuto. – pepe

Problemi correlati