2012-06-20 2 views
14

Люди Я пытаюсь использовать активную запись без рельсов и не могу, похоже, получить has_many, работая правильно. Ive никогда не пробовал использовать активную запись без рельсов. Я могу запросить из отдельных таблиц, но отношения, похоже, не работают. Может кто-нибудь быстро взглянуть и посмотреть, не пропадет ли что-нибудь. Вот окурокКак использовать активную запись без рельсов

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

и здесь ошибка

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 

любая помощь будет оценена.

+0

Если вы используете активную запись 3.2.3 (выглядит так), я бы рекомендовал обновить рубин с 1,8 до 1,9,3 с использованием RVM –

ответ

2

Указанный стек, который вы указали, точно говорит о том, что такое ошибка. Это в методе check_has_many:

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

Ваш пользователь имеет много проблем, поэтому он должен быть во множественном числе:

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

Кроме того, ваш BELONGS_TO: пользователи отношения в модели задачи, должны быть особым:

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

извините, я должен был показать, как я тоже это сделал, но я изменил его назад к тому, что вы только что опубликовали, и вот ошибка: – user740970

+0

.rvm/gems/ruby-1.8.7-p352/gems/activerecord-3.2.3/lib/active_record/relation/deleg.rb: 45: в 'method_missing ' : undefined method 'desc 'for []: ActiveRecord :: Relation (NoMethodError) из /home/wileybd/.rvm/gems/ruby-1.8.7-p352/gems/activerecord-3.2.3/lib/active_record/associations /collection_proxy.rb:100:в 'send ' из /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' от ./main.rb:44 – user740970

+0

, так что я думаю, что response_to не произошло по этому методу? – user740970

6

Я думаю, что знаю, что вы пытаетесь сделать. Если я не ошибаюсь, вы хотите отобразить значение desc для каждой проблемы для данного пользователя.

простой способ сделать то, что вам нужно, это сочетание ваших последних 2 методов:

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

Проблема вы имеете в своем коде, что семантически вы говорите что-то вроде «показать описание проблема (обратите внимание на это в единственном числе) пользователя»вместо того, чтобы сказать„показать описание каждой задачи пользователь имеет“, что, если бы это было возможно, должно быть что-то вроде этого:

puts user.problems.descs # This will not work 

Но это просто не так, как оно работает. Существует, хотя, new method, что вы могли бы использовать:

puts user.problems.pluck(:desc) 

Этот метод даст массив значения по убыванию каждой задачи для пользователя. Возможно, вы можете сыграть с выходом, чтобы напечатать его так, как вам нравится.

+1

+1 для pluck - Примечание: Доступно из 3.2.1+ –

+0

pepe, спасибо, что я смог заставить все работать сейчас. Кроме того, я снова забыл, что возвращаю коллекцию. Я тоже не знал о том, чтобы сорвать, еще раз спасибо. – user740970

+0

@ user740970 Добро пожаловать. Я рад, что могу помочь. – pepe

Смежные вопросы