Comment utiliser l'enregistrement active sans rails
Gens
Im essayant d'active record sans rails et ne peut pas sembler obtenir has_many fonctionne correctement. Ive jamais essayé à l'aide d'active record sans rails. Je peux interroger à partir de simples tables mais les relations ne semblent être au travail. Quelqu'un pourrait-il jeter un coup d'oeil et voir si je lui manque rien. Voici le 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
et voici l'erreur
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
toute aide serait appréciée.
Si vous êtes en cours d'exécution active record 3.2.3 (ressemble) je recommande la mise à niveau de ruby bof 1.8.7 pour 1.9.3 à l'aide de RVM
OriginalL'auteur user740970 | 2012-06-20
Vous devez vous connecter pour publier un commentaire.
Je pense que je sais ce que vous essayez de faire. Si je ne me trompe pas vous voulez afficher la description de la valeur de chaque problème pour un utilisateur donné.
Un moyen facile d'accomplir ce que vous avez besoin est une combinaison de vos 2 dernières méthodes:
Le problème que vous rencontrez dans votre code, c'est que du point de vue sémantique que vous dites quelque chose comme "afficher la description du problème (avis c'est au singulier) de l'utilisateur" au lieu de dire: "afficher la description de chaque problème, l'utilisateur a", qui, si elle était possible, devrait être quelque chose comme ceci:
Mais c'est juste pas la façon dont il fonctionne. Il est, cependant, un nouvelle méthode que vous pouvez utiliser:
Que la méthode va produire un tableau de la description de la valeur de chaque problème pour l'utilisateur. Vous pouvez probablement jouer avec la sortie de le faire imprimer la façon dont vous le souhaitez.
pepe, merci, j'ai été en mesure de faire tout ce travail maintenant. Aussi j'ai oublié encore une fois que je recevais une collection de dos. Je na sais de plumer soit, merci encore.
Vous êtes les bienvenus. Je suis content d'avoir pu aider.
OriginalL'auteur pepe
La stacktrace vous fournis dit exactement quelle est l'erreur. C'est dans le check_has_many méthode:
Votre utilisateur a BEAUCOUP de problèmes, donc il doit être au pluriel:
Aussi, votre belongs_to :les utilisateurs de la relation dans le Problème modèle, doit être au singulier:
.rvm/gems/ruby 1.8.7-p352/gems/activerecord-3.2.3/lib/active_record/relation/délégation.rb:45:
method_missing': undefined method
desc " pour []:ActiveRecord::Relation (NoMethodError) à partir de /home/wileybd/.rvm/gems/ruby-1.8.7-p352/gems/activerecord-3.2.3/lib/active_record/associations/collection_proxy.rb:100:danssend' 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' à partir de ./principal.rb:38:dans "le check_has_many' à partir de ./principal.rb:44donc je suppose que la respond_to n'est pas arrivé sur cette méthode?
Je pense que vous êtes absent de certains des principes fondamentaux de la façon dont ActiveRecord œuvres. il ne fonctionne pas parce que vous essayez d'appeler une méthode d'une instance sur une relation d'objet. Lire la railsguide et il doit expliquer beaucoup mieux que moi.guides.rubyonrails.org/active_record_querying.html
Votre message d'erreur ci-dessus indiquent qu'il ne peut pas trouver la méthode desc qui signifie de votre table de problème n'a pas de desc de la colonne. Et comme une bonne pratique, vous ne devriez pas utiliser des mots clés SQL que votre nom..desc est un.
OriginalL'auteur Peter Brown