user740970
user740970

Reputation: 269

How to use active record without rails

Folks Im trying to use active record without rails and cant seem to get has_many working properly. Ive never tried using active record without rails. I can query from single tables but the relationships dont seem to be working. Could anyone take a quick glance and see if im missing anything. Here is the stub

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

and here is the 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

any help would be appreciated.

Upvotes: 17

Views: 13434

Answers (2)

pepe
pepe

Reputation: 555

I think I know what you're trying to do. If I'm not mistaken you want to display the desc value of every problem for a given user.

An easy way to accomplish what you need is a combination of your last 2 methods:

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

The problem you are having in your code is that semantically you are saying something like "display the description of the problem (notice it's singular) of the user" instead of saying "display the description of each problem the user has", which if it were possible should be something like this:

puts user.problems.descs  # This will not work

But that is just not the way it works. There is, though, a new method that you could use:

puts user.problems.pluck(:desc)

That method will produce an array of the desc value of each problem for the user. You can probably play with the output to get it printed the way you like.

Upvotes: 6

Peter Brown
Peter Brown

Reputation: 51697

The stacktrace you provided says exactly what the error is. It's in the check_has_many method:

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

Your user has MANY problems, so it has to be plural:

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

Also, your belongs_to :users relationship in the Problem model, should be singular:

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

Upvotes: 2

Related Questions