ruby - Rails3 和 Datamapper

标签 ruby ruby-on-rails-3 activerecord migration datamapper

我将从使用 AR 和 arel 的 Rails 3 应用程序迁移到 datamapper。我喜欢像 Person.where(...).where(...).somescope.paginate(...).order(...) 这样的作用域链。如何从这种 arel 方法迁移到 datamapper。

最佳答案

DataMapper 中的命名范围只是您在模型类上定义的类方法。在这些类方法中,您通常会在某些条件下调用 #all 来获取 DataMapper::Collection。为了使您的类方法可链接,您必须确保返回DataMapper::Collection

为了完整起见,以下是安装说明...

gem install dm-core
gem install dm-migrations
gem install dm-sqlite-adapter
gem install dm-chunked_query

以及让您继续前进的代码(将其放入 test.rb 以获得最大的可重复性)

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__

ruby-1.9.2-p180@datamapper 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

参见https://github.com/postmodern/dm-chunked_query有关低级分页方法(批处理)的更多信息,该方法提供了本示例中使用的 #chunks 方法。

关于ruby - Rails3 和 Datamapper,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5338536/

相关文章:

ruby-on-rails - 将事件管理员登录重定向到设计登录

activerecord - 从深层嵌套的 activerecord 对象返回 json

ruby-on-rails - ActiveRecord .... activerecord-mysql-adapter

ruby-on-rails - Rails ActiveAdmin。如何设置默认值?

ruby-on-rails - 使用 Rails 控制台时 pry-stack_explorer 中的 NoMethodError

ruby-on-rails - Rails 嵌套单一资源路由

ruby-on-rails - 不能让 accepts_nested_attributes_for 工作两层深?

ruby-on-rails - 如何使 named_scope 与连接表一起正常工作?

Ruby C 扩展中的 C++,指针问题

ruby - 如何调用对象的自定义方法?