我正在用PHP构建应用程序,我正在使用数据映射器模式进行数据库访问.我正在考虑使用Observer模式让我的所有映射器观察它们创建的实体,这样它们就可以自动将任何更改保存回数据库而无需手动解析它们.
我只是想知道这是不是一个好主意,或者这是不好的做法等等?
我通常使用一些在层次结构中链接在一起的对象,并且目前必须手动将每个对象解析为它的映射器,这是相当繁琐的,所以只是尝试提出一个更好的解决方案.
谢谢,杰克
我正在使用DataMapper,一个用于ruby的开源ORM,而且我已经知道了.目前,DataMapper可以将战略预测加载(SEL)用于一对多关系,但不能使用多对多关系,其中发生N + 1个查询.我想破解正确的工作,但我找不到在哪里做.所以两部分问题:
我正在开发一个使用Datamapper作为其ORM的Rails 3.2应用程序.我正在寻找一种方法来根据相关模型的属性对结果集进行排序.具体来说我有以下型号:
class Vehicle
include DataMapper::Resource
belongs_to :user
end
class User
include DataMapper::Resource
has n, :vehicles
end
Run Code Online (Sandbox Code Playgroud)
现在我希望能够查询车辆并按驱动程序的名称对它们进行排序.我尝试了以下但似乎没有使用Datamapper:
> Vehicle.all( :order => 'users.name' )
ArgumentError: +options[:order]+ entry "users.name" does not map to a property in Vehicle
> Vehicle.all( :order => { :users => 'name' } )
ArgumentError: +options[:order]+ entry [:users, "name"] of an unsupported object Array
Run Code Online (Sandbox Code Playgroud)
现在我正在使用Ruby对查询后的结果集进行排序,但显然这对任何性能没有帮助,也阻止了我对其他范围的进一步链接.
首先介绍一些背景:我有一些相当简单的数据结构,它们作为json文件保存在磁盘上.这些json文件在不同语言和不同环境的应用程序(如Web前端和数据操作工具)之间共享.
对于我想要创建Python"POPO"(普通旧Python对象)的每个文件,以及每个项目的相应数据映射器类应该实现一些简单的CRUD行为(例如,save将序列化类并存储为json文件磁盘).
我认为一个简单的映射器(只知道基本类型)将起作用.但是,我担心安全问题.一些json文件将由Web前端生成,因此如果用户向我提供了一些糟糕的json,则可能存在安全风险.
最后,这里是简单的映射代码(在如何将JSON数据转换为Python对象中找到):
class User(object):
def __init__(self, name, username):
self.name = name
self.username = username
import json
j = json.loads(your_json)
u = User(**j)
Run Code Online (Sandbox Code Playgroud)
您看到了哪些可能的安全问题?
注意:我是Python的新手.
编辑:全部感谢您的评论.我发现我有一个json,我有2个数组,每个都有一个地图.不幸的是,当我得到更多这些时,这开始变得很麻烦.
我正在将问题扩展到将json输入映射到recordtype.原始代码来自:https://stackoverflow.com/a/15882054/1708349.因为我需要可变对象,所以我将其更改为使用namedlist而不是namedtuple:
import json
from namedlist import namedlist
data = '{"name": "John Smith", "hometown": {"name": "New York", "id": 123}}'
# Parse JSON into an object with attributes corresponding to dict keys.
x = json.loads(data, object_hook=lambda d: namedlist('X', d.keys())(*d.values()))
print x.name, x.hometown.name, x.hometown.id
Run Code Online (Sandbox Code Playgroud)
它还安全吗?
当我在Sinatra尝试这样做时,
class Comment
include DataMapper::Resource
property :id, Serial
property :body, Text
property :created_at, DateTime
end
get '/show' do
comment = Comment.all
@comment.each do |comment|
"#{comment.body}"
end
end
它返回此错误,
ERROR: undefined method `bytesize' for #<Comment:0x13a2248>
Run Code Online (Sandbox Code Playgroud)
有人能指出我正确的方向吗?
谢谢,
我已经设法在App Engine上运行基本的rails app1:http: //gist.github.com/268192
所以,在我的基本app2上,我安装了CE,它在本地机器上工作正常.(communityengine.org)
但是,当我按照我的实际APP 2,其中community_engine插件安装和所有的宝石被冻结相同的步骤,App Engine的安装脚本询问超过编写各种文件一样的boot.rb,routes.rb中,这我不允许.
因此,正如预期的那样,当我将rails + ce应用程序发布到GAE时,它没有发布,它还会在app2上修复CE的本地安装.
所以,问题很明显,CE使用ActiveRecord,而GAE使用DataMapper.
所以,我的问题也可以改为:我们可以使用Active Record将现有的ROR应用程序迁移到使用DataMapper的GAE吗?
PS:这是我关于ROR和GAE的第一个项目.
google-app-engine activerecord ruby-on-rails jruby datamapper
我是Ruby的新手.我安装了DataMapper,我正在尝试安装dm-mysql-adapter-1.0.2 gem.但是当我尝试安装时,我收到以下错误.我正在使用ubuntu OS.
vinoth@vinoth-laptop:~/Downloads$ gem install dm-mysql-adapter-1.0.2 -- --with-mysql- lib=/usr/lib/mysql -- --with-mysql-conf=/usr/bin/mysql
WARNING: Installing to ~/.gem since /home/vinoth/gems and
/home/vinoth/gems/bin aren't both writable.
WARNING: You don't have /home/vinoth/.gem/ruby/1.8/bin in your PATH,
gem executables will not run.
Building native extensions. This could take a while...
ERROR: Error installing dm-mysql-adapter-1.0.2:
ERROR: Failed to build gem native extension.
/usr/bin/ruby1.8 extconf.rb --with-mysql-lib=/usr/lib/mysql -- --with-mysql- conf=/usr/bin/mysql
checking for mysql_query() in -lmysqlclient... no
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably …Run Code Online (Sandbox Code Playgroud) 我正在比较Doctrine 2和Propel 1.5/1.6,我正在研究他们使用的一些模式.Doctrine使用DataMapper模式,而Propel使用ActiveRecord模式.虽然我可以看到的DataMapper是相当复杂的,我会承担一些设计灵活性来源于此并发症.到目前为止,我发现使用DataMapper而不是ActiveRecord的唯一正当理由是DataMapper在单一责任原则方面更好 - 因为数据库行不是持久化的实际对象,但是Propel并不是真的关心我,因为无论如何它都是生成的代码.
那么 - 是什么让DataMapper更加灵活?
这个简单的例子使用DataMapper的before :save回调(aka hook)来递增callback_count.callback_count初始化为0,并应由回调设置为1.
通过以下方式创建TestObject时,将调用此回调:
TestObject.create()
Run Code Online (Sandbox Code Playgroud)
但是当FactoryGirl通过以下方式创建时会跳过回调:
FactoryGirl.create(:test_object)
Run Code Online (Sandbox Code Playgroud)
知道为什么吗?[注意:我正在运行ruby 1.9.3,factory_girl 4.2.0,data_mapper 1.2.0]
详细信息如下......
# file: models/test_model.rb
class TestModel
include DataMapper::Resource
property :id, Serial
property :callback_count, Integer, :default => 0
before :save do
self.callback_count += 1
end
end
Run Code Online (Sandbox Code Playgroud)
# file: spec/factories.rb
FactoryGirl.define do
factory :test_model do
end
end
Run Code Online (Sandbox Code Playgroud)
# file: spec/models/test_model_spec.rb
require 'spec_helper'
describe "TestModel Model" do
it 'calls before :save using TestModel.create' do
test_model = TestModel.create
test_model.callback_count.should == 1
end
it 'fails to call …Run Code Online (Sandbox Code Playgroud) 在应用Data Mapper模式时,模型(在我的案例中为Domain Model)负责业务逻辑,而不是将实体保存到数据库的映射器.
构建一个单独的业务逻辑验证器来处理模型之外的用户提供的数据似乎是否合理?
下面是PHP语法中的一个例子.
假设我们有一个实体$person.假设该实体具有一个surname在保存时不能为空的属性.
用户输入了非法的空值surname.由于模型负责封装业务逻辑,$person->surname = $surname;因此当用户输入的$surname是空字符串时,我希望以某种方式说操作不成功.
在我看来,$person如果我们试图用非法值填充其中一个属性,那么应该抛出异常.
但是,从我读过的例外情况来看, "输入'坏'输入的用户也不例外:这是预期的." 其含义是不依赖异常来验证用户数据.
您如何建议解决此问题,在让域模型定义业务逻辑之间取得平衡,而不是依赖于域模型在填写用户输入数据时抛出的异常?
datamapper ×10
php ×3
ruby ×3
activerecord ×1
associations ×1
database ×1
domain-model ×1
factory-bot ×1
jruby ×1
json ×1
orm ×1
python ×1
sinatra ×1
sorting ×1