虽然我将以1:1的关系选择Ghost模式,但我不确定这是否足以构成1:n的关系.
例如,当我加载一个可能有一百个Item对象的Order对象时,我首先会给items属性赋值NULL.
问题是:
A)我应该分配NULL然后,在第一次访问items属性时查找该项的所有订单并加载所有这些订单?
B)或者我应该只加载一个只包含所有order_id的轻量级记录集,并加载100个Item Ghost对象,这些对象只设置了order_id,但其他一切都是NULL - 一旦访问了Item对象以从中获取更多细节,懒加载那个特定的Item对象数据?
DataMapper是否提供了一种在不存在或更新现有记录时创建新记录的便捷方法?我在API文档中找不到任何内容.
这就是我目前看来并不优雅的东西:
foo = Foo.get(id)
if foo.nil?
foo = Foo.create(#attributes...)
else
foo.update(#attributes...)
end
foo.save
Run Code Online (Sandbox Code Playgroud) 对于传统的MySQL 5.1数据库,哪个ORM最适合使用新的Rails 3应用程序?我不希望对这个数据库进行迁移(尽管模式可能会不时发生变化),但我一定会写信给它.
我正在尝试在我的机器上安装DataMapper的dm-types
gem install dm-types
Run Code Online (Sandbox Code Playgroud)
我从RubyInstaller(1.9.3)安装了Ruby,我也安装了DevKit.(以及其他一些宝石,如sinatra,haml,dm-core和bcrypt-ruby).
但是,当我运行"gem install dm-types"时,会发生这种情况.
C:\Users\Lev>gem install dm-types
Temporarily enhancing PATH to include DevKit...
Building native extensions. This could take a while...
ERROR: Error installing dm-types:
ERROR: Failed to build gem native extension.
"C:/Program Files (x86)/Ruby/Ruby193/bin/ruby.exe" extconf.rb
creating Makefile
make
Makefile:172: warning: overriding commands for target `C:/Program'
Makefile:163: warning: ignoring old commands for target `C:/Program'
Makefile:172: warning: overriding commands for target `Files'
Makefile:163: warning: ignoring old commands for target `Files'
Makefile:215: *** multiple target patterns. Stop.
Gem …Run Code Online (Sandbox Code Playgroud) 由于某种原因,heroku试图要求dm-sqlite-adapter,即使它应该在这里使用Postgres.请注意,当我打开任何URL时会发生这种情况 - 而不是在git push本身.
我建立了默认的Facebook应用程序.
Gemfile:
source :gemcutter
gem "foreman"
gem "sinatra"
gem "mogli"
gem "json"
gem "httparty"
gem "thin"
gem "data_mapper"
gem "heroku"
group :production do
gem "pg"
gem "dm-postgres-adapter"
end
group :development, :test do
gem "sqlite3"
gem "dm-sqlite-adapter"
end
Run Code Online (Sandbox Code Playgroud)
数据映射器设置:
# Setting up the database
DataMapper.setup(:default, ENV['DATABASE_URL'] || "sqlite3://#{Dir.pwd}/data/mydatabase.db")
Run Code Online (Sandbox Code Playgroud)
打开任何URL时的相关日志片段:
Starting process with command `bundle exec thin -R config.ru start -p 34984`
2012-01-18T15:11:55+00:00 app[web.1]: /app/vendor/bundle/ruby/1.9.1/gems/dm-core-1.2.0/lib/dm-core/adapters.rb:163:in `require': no such file to load -- dm-sqlite-adapter (LoadError)
2012-01-18T15:11:55+00:00 app[web.1]: from /app/vendor/bundle/ruby/1.9.1/gems/dm-core-1.2.0/lib/dm-core/adapters.rb:163:in …Run Code Online (Sandbox Code Playgroud) 我找到了几个使用datamapper的例子,并且能够让它们运行起来.所有这些示例都是针对sqlite数据库的.我正在尝试将datamapper与postgresql一起使用.
我将datamapper中的调用从sqlite3更改为postgres,我已经安装了dm-postgres-adapter.但它仍然无效.
还有什么我需要做的?
建立:
Ruby on rails 3.2.2
Ruby 1.9.2
dataMapper 1.2.0
mongoid 2.4.8
mongoid_orderable 1.0.0
Run Code Online (Sandbox Code Playgroud)
获得keys must be strings or symbols使用mongoid_orderable时错误.
我认为这与我使用的dataMapper有关,除了mongid(使用dataMapper从其他服务器移植数据)
我注意到dataMapper和mongoid之间的冲突,因为它们都使用各种方法扩展Symbol,asc,desc等.这可能是同样的问题吗?
如果有任何帮助,这是我的stacktrace的片段:
keys must be strings or symbols
/Users/hmm/.rbenv/versions/1.9.2-p290/lib/ruby/gems/1.9.1/gems/bson-1.6.2/lib/bson/bson_c.rb:24:in `serialize'
/Users/hmm/.rbenv/versions/1.9.2-p290/lib/ruby/gems/1.9.1/gems/bson-1.6.2/lib/bson/bson_c.rb:24:in `serialize'
/Users/hmm/.rbenv/versions/1.9.2-p290/lib/ruby/gems/1.9.1/gems/mongo-1.6.2/lib/mongo/collection.rb:436:in `update'
/Users/hmm/.rbenv/versions/1.9.2-p290/lib/ruby/gems/1.9.1/gems/mongoid-2.4.8/lib/mongoid/collections/master.rb:25:in `block in update'
/Users/hmm/.rbenv/versions/1.9.2-p290/lib/ruby/gems/1.9.1/gems/mongoid-2.4.8/lib/mongoid/collections/retry.rb:29:in `retry_on_connection_failure'
/Users/hmm/.rbenv/versions/1.9.2-p290/lib/ruby/gems/1.9.1/gems/mongoid-2.4.8/lib/mongoid/collections/master.rb:24:in `update'
/Users/hmm/.rbenv/versions/1.9.2-p290/lib/ruby/gems/1.9.1/gems/mongoid-2.4.8/lib/mongoid/collection.rb:149:in `update'
/Users/hmm/.rbenv/versions/1.9.2-p290/lib/ruby/gems/1.9.1/gems/mongoid_orderable-1.0.0/lib/mongoid_orderable/mongoid/contexts/mongo.rb:6:in `inc'
/Users/hmm/.rbenv/versions/1.9.2-p290/lib/ruby/gems/1.9.1/gems/mongoid_orderable-1.0.0/lib/mongoid_orderable/mongoid/criteria.rb:1:in `inc'
/Users/hmm/.rbenv/versions/1.9.2-p290/lib/ruby/gems/1.9.1/gems/mongoid_orderable-1.0.0/lib/mongoid/orderable.rb:125:in `apply_position'
/Users/hmm/.rbenv/versions/1.9.2-p290/lib/ruby/gems/1.9.1/gems/mongoid_orderable-1.0.0/lib/mongoid/orderable.rb:85:in `add_to_list'
/Users/hmm/.rbenv/versions/1.9.2-p290/lib/ruby/gems/1.9.1/gems/activesupport-3.2.2/lib/active_support/callbacks.rb:419:in `block in _run__3008157942946527494__save__4591629889417243504__callbacks'
/Users/hmm/.rbenv/versions/1.9.2-p290/lib/ruby/gems/1.9.1/gems/activesupport-3.2.2/lib/active_support/callbacks.rb:215:in `block in _conditional_callback_around_742'
Run Code Online (Sandbox Code Playgroud)
mongoid_orderable的当前实现如下:
class MyModel
include Mongoid::Document
include Mongoid::Orderable
default_scope order_by(:position => :asc)
end
Run Code Online (Sandbox Code Playgroud)
我很确定它与基于stacktrace的_mongoid_orderable_有关,并且如果我注释掉_mongoid_orderable_相关的行,它就可以工作.此处也提出了一个问题
我正在从头开始编写一个新的网站项目.该项目在C#中,但我的背景是在PHP中(下面的伪代码有点混合,试图简洁和声明).
问题
我需要从两个地方之一检索配置数据 - 有时从本地数据库,有时从Soap服务.我应该能够从任一源创建同一组Model对象.
数据存储在不同数据源中完全不同的结构中 - 需要从Soap端拼凑出几个不同的Soap响应,而DB结构更接近于我在代码中构建模型对象的方式.
配置由对象树组成:产品包含属性,其中包含选项,这些选项具有应用时间的条件.
目标
我想尽可能地分开关注点(希望能够促进测试/维护/扩展能力):
问题
我知道各种各样的设计模式(虽然我不完全确定我完全理解它们).我向程序员提出了一个与此类似的问题,得到了关于Persistence Ignorance(更多信息)和Repository模式的回复,它们似乎都是来自Microsoft世界的概念.
据我所知,"Persistence Ignorance"只是让Model对象对你的数据存储机制一无所知的概念,而Repository模式看起来与Data Mapper模式非常相似,只不过它可能更像是一个外观,隐藏更多实际发生的事情.
所以我的问题是:
在Data Mapper模式中,每个Model对象应该有一个Mapper吗?而不是一个整个配置树?
因此,我应该有一个使用所有Mapper对象的配置树构建对象吗?
class ConfigBuilder() {
public ConfigBuilder (productMapper, propertyMapper, optionMapper, conditionMapper) {
// save them into local properties
}
public Products() {
var products = productMapper.FetchAll();
foreach (var product in products) {
AddProperties(product);
}
return …Run Code Online (Sandbox Code Playgroud) c# model-view-controller design-patterns data-access-layer datamapper
当我将我的服务器升级到php7 codeigniter,特别是datamapper ORM给我这个错误...
消息:访问静态属性DataMapper :: $ config为非静态
文件名:libraries/datamapper.php行号:6474
有问题的功能是......
protected function _dmz_assign_libraries()
{
static $CI;
if ($CI || $CI =& get_instance())
{
// make sure these exists to not trip __get()
$this->load = NULL;
$this->config = NULL;
$this->lang = NULL;
// access to the loader
$this->load =& $CI->load;
// to the config
$this->config =& $CI->config;
// and the language class
$this->lang =& $CI->lang;
}
}
Run Code Online (Sandbox Code Playgroud) 我正在使用此处提供的解决方案在 CRUD列表中添加用于批量操作的复选框。
但是,我的结果与Pagerfanta分页,因此看来我需要在表单中使用DataMapper。
我尝试了各种解决方案,但是无法在表单数据中获得所选字段:
class ModelEntitySelectionType extends AbstractType implements DataMapperInterface
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('model_id', EntityType::class, [
'required' => false,
'class' => ModelFile::class,
'choice_label' => 'id',
'property_path' => '[id]', # in square brackets!
'multiple' => true,
'expanded' => true
])
->add('action', ChoiceType::class, [
'choices' => [
'Delete' => 'delete'
]
])
->add('submit', SubmitType::class, [
'label' => 'Process'
])
->setDataMapper($this)
;
}
public function setDefaultOptions(ExceptionInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => null,
'csrf_protection' => false …Run Code Online (Sandbox Code Playgroud) datamapper ×10
ruby ×4
database ×2
orm ×2
activerecord ×1
c# ×1
codeigniter ×1
forms ×1
heroku ×1
mongoid ×1
mysql ×1
postgresql ×1
rubygems ×1
sinatra ×1
symfony ×1
windows ×1