2012-06-20 11 views
14

Ludzie Próbuję użyć aktywnej płyty bez szyn i wydaje się, że dostaję has_many działa poprawnie. Nigdy nie próbowałem używać aktywnego rekordu bez szyn. Mogę zapytać o pojedyncze tabele, ale relacje nie działają. Czy ktoś mógłby rzucić szybkie spojrzenie i zobaczyć, czy im czegoś brakuje. Oto stubJak korzystać z aktywnego zapisu bez szyn

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

i tu jest błąd

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 

Każda pomoc będzie mile widziane.

+0

Jeśli używasz aktywnego rekordu 3.2.3 (wygląda na to), zaleciłbym uaktualnienie ruby ​​z 1.8.7 do 1.9.3 przy użyciu RVM –

Odpowiedz

2

Podany stacktrace mówi dokładnie, co to jest błąd. To w metodzie check_has_many:

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

Twój użytkownik ma wiele problemów, więc musi to być liczba mnoga:

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

Również Twój belongs_to: relacje użytkowników w modelu problemem, powinny być pojedyncza:

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

Przepraszam, że powinienem pokazać, jak również próbowałem, ale zmieniłem to wróć do tego, co właśnie napisałeś i tutaj jest teraz błąd – user740970

+0

.rvm/gems/ruby-1.8.7-p352/gems/activerecord-3.2.3/lib/active_record/relation/delegation.rb: 45: in 'method_missing ' : undefined metoda 'desc 'dla []: ActiveRecord :: Relation (NoMethodError) z /home/wileybd/.rvm/gems/ruby-1.8.7-p352/gems/activerecord-3.2.3/lib/active_record/associations /collection_proxy.rb:100:in 'send ' from /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 ' from ./main.rb:38:in' check_has_many' from ./main.rb:44 – user740970

+0

więc domyślam się, że respond_to nie zdarzyło się na tej metodzie? – user740970

6

Myślę, że wiem, co próbujesz zrobić. Jeśli się nie mylę, chcesz wyświetlić wartość desc każdego problemu dla danego użytkownika.

Łatwym sposobem, aby osiągnąć to, czego potrzebujesz to połączenie z twoich ostatnich 2 metod:

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

Problem masz w kodzie jest semantycznie mówisz coś w stylu „wyświetli się z opisem problem (zauważ, że to pojedyncza) użytkownika”zamiast mówić«wyświetlić opis każdego problemu użytkownik ma», które jeśli to możliwe powinno być coś takiego:

puts user.problems.descs # This will not work 

Ale to jest po prostu nie sposób to działa. Istnieje jednak new method że można użyć:

puts user.problems.pluck(:desc) 

ta metoda przyniesie tablicę wartości malejąco każdego problemu dla użytkownika. Prawdopodobnie możesz odtwarzać z wyjściem, aby wydrukować je w sposób, jaki chcesz.

+1

+1 za zrzucenie - Uwaga: Dostępne od 3.2.1+ –

+0

pepe, dzięki, byłem w stanie sprawić, że wszystko działa teraz. Również znowu zapomniałem, że odzyskałem kolekcję. Nie wiedziałem też o zrywaniu, dzięki jeszcze raz. – user740970

+0

@ user740970 Nie ma za co. Cieszę się, że mogę pomóc. – pepe

Powiązane problemy