Как использовать активную запись без рельсов
Folks
Я пытаюсь использовать активную запись без рельсов и не могу заставить 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
любая помощь будет оценена.
Ответы
Ответ 1
Думаю, я знаю, что вы пытаетесь сделать. Если я не ошибаюсь, вы хотите отобразить значение desc для каждой проблемы для данного пользователя.
Простой способ выполнить то, что вам нужно, это сочетание ваших последних двух методов:
user = User.first
user.problems.each do |pr|
puts pr.desc
end
Проблема, которую вы испытываете в своем коде, состоит в том, что семантически вы говорите что-то вроде "отображаете описание проблемы (обратите внимание на нее) пользователя", вместо того, чтобы говорить "отображать описание каждой проблемы, которую пользователь имеет", который, если это было возможно, должен быть примерно таким:
puts user.problems.descs # This will not work
Но это не так, как это работает. Существует, однако, новый метод, который вы могли бы использовать:
puts user.problems.pluck(:desc)
Этот метод будет генерировать массив значения desc каждой проблемы для пользователя. Возможно, вы можете сыграть с выходом, чтобы напечатать его так, как вам нравится.
Ответ 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: users в модели проблемы должно быть сингулярным:
class Problem < ActiveRecord::Base
belongs_to :user # <=== singular, not :users
end