Je vais migrer de l'application rails 3 qui utilisait AR et arel pour datamapper. J'adore les chaînes de portées comme Person.where (...). Où (...). Somescope.paginate (...). Order (...). comment migrer de cette approche arel vers datamapper.Rails3 et Datamapper
2
A
Répondre
6
Les étendues nommées dans DataMapper sont simplement des méthodes de classe que vous définissez sur vos classes de modèle. Dans ces méthodes de classe, vous appelez généralement #all
avec certaines conditions pour obtenir un DataMapper::Collection
. Pour que vos méthodes de classe soient chaînables, vous devez assurez-vous de renvoyer un DataMapper::Collection
.
Pour être complet bien, voici les instructions d'installation ...
gem install dm-core
gem install dm-migrations
gem install dm-sqlite-adapter
gem install dm-chunked_query
Et le code pour vous aider à aller (mettre cela en test.rb pour un maximum reproductibilité)
require 'rubygems'
require 'dm-core'
require 'dm-migrations'
require 'dm-chunked_query'
class Person
include DataMapper::Resource
property :id, Serial
property :name, String
property :hobby, String
property :country, String
property :continent, String
def self.european
all(:continent => 'Europe')
end
def self.hackers
all(:hobby => 'Hacking')
end
def self.named(name)
all(:name => name)
end
end
DataMapper::Logger.new($stdout, :debug)
DataMapper.setup(:default, 'sqlite::memory:')
DataMapper.finalize.auto_migrate!
1.upto(10) do |i|
Person.create(:name => "Alex", :hobby => 'Hacking', :country => "Country-#{i}", :continent => 'Europe')
end
# you could even skip the explicit call to #all
# i just left it in there because it reads nicely
Person.all.european.hackers.named('Alex').chunks(5).each_with_index do |chunk, idx|
puts "Rendering page #{idx + 1}"
chunk.each do |person|
puts "Someone named #{person.name} who lives in #{person.country}"
end
end
__END__
[email protected] mungo:dm-rails snusnu$ ruby test.rb
~ (0.000102) SELECT sqlite_version(*)
~ (0.000132) DROP TABLE IF EXISTS "people"
~ (0.000013) PRAGMA table_info("people")
~ (0.000315) CREATE TABLE "people" ("id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, "name" VARCHAR(50), "hobby" VARCHAR(50), "country" VARCHAR(50), "continent" VARCHAR(50))
~ (0.000049) INSERT INTO "people" ("name", "hobby", "country", "continent") VALUES ('Alex', 'Hacking', 'Country-1', 'Europe')
~ (0.000056) INSERT INTO "people" ("name", "hobby", "country", "continent") VALUES ('Alex', 'Hacking', 'Country-2', 'Europe')
~ (0.000044) INSERT INTO "people" ("name", "hobby", "country", "continent") VALUES ('Alex', 'Hacking', 'Country-3', 'Europe')
~ (0.000043) INSERT INTO "people" ("name", "hobby", "country", "continent") VALUES ('Alex', 'Hacking', 'Country-4', 'Europe')
~ (0.000037) INSERT INTO "people" ("name", "hobby", "country", "continent") VALUES ('Alex', 'Hacking', 'Country-5', 'Europe')
~ (0.000038) INSERT INTO "people" ("name", "hobby", "country", "continent") VALUES ('Alex', 'Hacking', 'Country-6', 'Europe')
~ (0.000035) INSERT INTO "people" ("name", "hobby", "country", "continent") VALUES ('Alex', 'Hacking', 'Country-7', 'Europe')
~ (0.000035) INSERT INTO "people" ("name", "hobby", "country", "continent") VALUES ('Alex', 'Hacking', 'Country-8', 'Europe')
~ (0.000036) INSERT INTO "people" ("name", "hobby", "country", "continent") VALUES ('Alex', 'Hacking', 'Country-9', 'Europe')
~ (0.000039) INSERT INTO "people" ("name", "hobby", "country", "continent") VALUES ('Alex', 'Hacking', 'Country-10', 'Europe')
~ (0.000069) SELECT "id", "name", "hobby", "country", "continent" FROM "people" WHERE ("continent" = 'Europe' AND "hobby" = 'Hacking' AND "name" = 'Alex') ORDER BY "id"
Rendering page 1
Someone named Alex who lives in Country-1
Someone named Alex who lives in Country-2
Someone named Alex who lives in Country-3
Someone named Alex who lives in Country-4
Someone named Alex who lives in Country-5
Rendering page 2
Someone named Alex who lives in Country-6
Someone named Alex who lives in Country-7
Someone named Alex who lives in Country-8
Someone named Alex who lives in Country-9
Someone named Alex who lives in Country-10
Voir https://github.com/postmodern/dm-chunked_query pour plus d'informations sur l'approche de bas niveau de pagination (traitement par lots) qui fournit la méthode #chunks
utilisée dans cet exemple.
Questions connexes
- 1. Comment faire la migration de base de données Rails3 + datamapper
- 2. Rails3 + Datamapper - connexions de bases de données concurrentes
- 3. DateTime et DataMapper
- 4. Sinatra et DataMapper Association
- 5. CodeIgniter et DataMapper ORM
- 6. youtube-g et rails3
- 7. Rails3 et Omniauth-google
- 8. Rails3 et Respond_with problème
- 9. Mysql gem et Rails3
- 10. Rails3 RVM et zsh
- 11. Rails3 et Paperclip
- 12. authsmtp mail et rails3
- 13. Rails3: Prenez le contrôle de produit JSON (to_json avec DataMapper ORM)
- 14. Tendance actuelle dans les modèles de test dans une application rails3 + datamapper
- 15. Meilleure façon de gérer 404 contrôleurs Rails3 avec un DataMapper get
- 16. DataMapper, Modèle
- 17. Association DataMapper
- 18. Facebooker et Rails3 avec OpenGraph
- 19. Rails3 et liens nofollow automatiques
- 20. Rails3 et problème de readline
- 21. NoHandlerError avec Rails3 et Paperclip
- 22. Rails3, JQuery et RJS (UJS)
- 23. rails3, sessions et plusieurs modèles
- 24. Rails3 helpers et contenu dynamique
- 25. Pagination DataMapper
- 26. DataMapper datatype
- 27. DataMapper Dates
- 28. DataMapper - pourquoi "a" et "appartient à"?
- 29. Attributs virtuels avec Sinatra et Datamapper
- 30. Modification d'enregistrements avec SQLite, DataMapper et Sinatra
tnx, cela sera utile. En général, tout dans DataMapper = où dans AR + metawhere? – AlexParamonov
Désolé, je ne suis pas familier avec metawhere et pas vraiment familier avec le nouveau AR basé AR. En général, 'DataMapper :: Model.all' est l'API pour construire des requêtes avec DM qui mènent finalement à des collections matérialisées de données une fois" kickées ". Une fois que vous avez un handle d'une 'DataMapper :: Query' ou' DataMapper :: Collection' vous pouvez affiner cela pour construire la requête éventuelle ou transformer les données récupérées dans des formulaires appropriés pour le traitement (ultérieur). – snusnu