2012-06-20 28 views
14

Folks Tôi đang cố gắng sử dụng bản ghi hoạt động mà không có đường ray và dường như không thể làm cho has_many hoạt động bình thường. Ive không bao giờ thử sử dụng bản ghi hoạt động mà không có đường ray. Tôi có thể truy vấn từ các bảng đơn nhưng các mối quan hệ dường như không hoạt động. Bất cứ ai có thể có một cái nhìn nhanh chóng và xem nếu im thiếu bất cứ điều gì. Dưới đây là sơ khaiCách sử dụng bản ghi hoạt động không có đường ray

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

và đây là lỗi

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 

bất kỳ trợ giúp sẽ được đánh giá cao.

+0

Nếu bạn đang chạy bản ghi hoạt động 3.2.3 (có vẻ như nó) Tôi khuyên bạn nên nâng cấp ruby ​​fro 1.8.7 lên 1.9.3 sử dụng RVM –

Trả lời

2

Stacktrace bạn cung cấp cho biết chính xác lỗi là gì. Đó là trong phương pháp check_has_many:

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

sử dụng của bạn có vấn đề về NHIỀU, vì vậy nó phải là số nhiều:

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

Ngoài ra, belongs_to của bạn: mối quan hệ sử dụng trong mô hình Vấn đề, nên là số ít:

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

xin lỗi tôi đã cho thấy tôi đã thử như thế nào, nhưng tôi đã thay đổi trở lại những gì bạn vừa mới đăng và đây là lỗi ngay bây giờ – user740970

+0

.rvm/gems/ruby-1.8.7-p352/gems/activerecord-3.2.3/lib/active_record/quan hệ/phái đoàn.rb: 45: trong 'method_missing ' : undefined method 'desc 'cho []: ActiveRecord :: Relation (NoMethodError) từ /home/wileybd/.rvm/gems/ruby-1.8.7-p352/gems/activerecord-3.2.3/lib/active_record/associations /collection_proxy.rb:100:in 'gửi' từ /home/wileybd/.rvm/gems/ruby-1.8.7-p352/gems/activerecord-3.2.3/lib/active_record/associations/collection_proxy.rb:100 : trong 'method_missing ' từ ./main.rb:38:in' check_has_many' từ ./main.rb:44 – user740970

+0

vì vậy tôi đoán response_to không xảy ra trên phương pháp đó? – user740970

6

Tôi nghĩ rằng tôi biết những gì bạn đang cố gắng làm. Nếu tôi không nhầm, bạn muốn hiển thị giá trị desc của mọi vấn đề cho một người dùng nhất định.

Một cách dễ dàng để thực hiện những gì bạn cần là một sự kết hợp của 2 phương pháp cuối cùng của bạn:

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

Vấn đề bạn đang gặp trong mã của bạn là ngữ nghĩa bạn đang nói cái gì đó như "hiển thị mô tả của vấn đề (chú ý đó là số ít) của người sử dụng" thay vì nói 'hiển thị mô tả của mỗi vấn đề người dùng có', mà nếu có thể nên một cái gì đó như thế này:

puts user.problems.descs # This will not work 

Nhưng đó chỉ là không đường nó hoạt động. Có nghĩa là, tuy nhiên, một new method mà bạn có thể sử dụng:

puts user.problems.pluck(:desc) 

phương pháp đó sẽ tạo ra một mảng các giá trị desc của mỗi vấn đề cho người dùng. Bạn có thể chơi với đầu ra để in nó theo cách bạn muốn.

+1

+1 for pluck - Lưu ý: Có sẵn từ 3.2.1+ –

+0

pepe, cảm ơn tôi đã có thể làm mọi thứ hoạt động ngay bây giờ. Ngoài ra tôi quên một lần nữa rằng tôi đã nhận được một bộ sưu tập trở lại. Tôi cũng không biết nhổ, cảm ơn lần nữa. – user740970

+0

@ user740970 Bạn được chào đón. Tôi rất vui vì tôi có thể giúp đỡ. – pepe

Các vấn đề liên quan