2012-06-20 16 views
14

Gente Im tratando de usar el registro activo sin rieles y parece que no puede obtener has_many funcionando correctamente. Nunca he intentado usar el registro activo sin rieles. Puedo consultar desde tablas individuales, pero las relaciones parecen no estar funcionando. ¿Alguien puede echar un rápido vistazo y ver si me falta algo? Aquí está el talón deCómo utilizar el registro activo sin rieles

#!/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 

y aquí está el error

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 

se agradecería cualquier ayuda.

+0

Si está ejecutando el registro activo 3.2.3 (parece que sí) Le recomendaría actualizar el rubí de 1.8.7 a 1.9.3 usando RVM –

Respuesta

2

La pila que proporcionó dice exactamente cuál es el error. Es en el método check_has_many:

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

Su usuario tiene problemas de muchos, por lo que tiene que ser plural:

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

Además, su belongs_to: los usuarios relación en el modelo del problema, debe ser singular:

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

lo siento, debería haber mostrado cómo lo intenté también, pero lo cambié volviendo a lo que acabas de publicar y aquí está el error ahora – user740970

+0

.rvm/gems/ruby-1.8.7-p352/gems/activerecord-3.2.3/lib/active_record/relation/delegation.rb: 45: en 'method_missing ' : método undefined 'desc 'para []: ActiveRecord :: Relation (NoMethodError) de /home/wileybd/.rvm/gems/ruby-1.8.7-p352/gems/activerecord-3.2.3/lib/active_record/associations /collection_proxy.rb:100:in 'send ' de /home/wileybd/.rvm/gems/ruby-1.8.7-p352/gems/activerecord-3.2.3/lib/active_record/associations/collection_proxy.rb:100 : en 'method_missing ' de ./main.rb:38:in' check_has_many' de ./main.rb:44 – user740970

+0

así que supongo que la respuesta no ocurrió en ese método? – user740970

6

Creo que sé lo que estás tratando de hacer. Si no me equivoco, desea mostrar el valor desc de cada problema para un usuario dado.

Una manera fácil de lograr lo que necesita es una combinación de sus últimos 2 métodos:

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

El problema que tiene en su código es que semánticamente que está diciendo algo así como "mostrar la descripción de la problema (nótese que es singular) del usuario" en lugar de decir 'mostrar la descripción de cada problema que el usuario tiene', que si fuera posible debería ser algo como esto:

puts user.problems.descs # This will not work 

Pero eso no es sólo la forma funciona. Hay, sin embargo, un new method que se puede utilizar:

puts user.problems.pluck(:desc) 

Ese método producirá una serie de desc el valor de cada problema para el usuario. Probablemente pueda jugar con la salida para imprimirla de la manera que desee.

+1

+1 para desplumar - Nota: disponible desde 3.2.1+ –

+0

pepe, gracias pude hacer que todo funcione ahora. También olvidé de nuevo que estaba recuperando una colección. Yo tampoco sabía de arrancar, gracias de nuevo. – user740970

+0

@ user740970 De nada. Me alegro de poder ser de ayuda. – pepe

Cuestiones relacionadas