我刚看了一篇博客文章,用银行类比来解释MVC.我有几个月使用MVC框架(CakePHP)进行Web应用程序开发的经验,所以我得到了基础知识,但我开始看到一个主题让我觉得我采用了一种有缺陷的方法来处理逻辑:
在我的应用程序中,模型是厌食症,控制器是肥胖的.我在控制器中有所有业务逻辑,除了模型中的关联和验证规则之外什么也没有.
通过我的控制器扫描,我现在可以识别出许多应该放在模型中的逻辑:
现在问我的问题:
我有一个我想验证的字段.我希望该字段可以留空,但如果用户输入数据,我希望它以某种格式.目前我在模型中使用以下验证,但这不允许用户将其留空:
validates_length_of :foo, :maximum => 5
validates_length_of :foo, :minimum => 5
Run Code Online (Sandbox Code Playgroud)
我如何写这个来实现我的目标?
使用一个简单示例进行设置:我有一个table(Totals),它保存amount第二个表(Things)中每个记录的列的总和.
当thing.amount更新时,我想简单地添加旧值和新值之间的差异total.sum.
现在我正在减去self.amount期间before_update并self.amount在期间添加after_update.这使得WAY过于信任更新成功.
约束: 我不想简单地重新计算所有交易的总和.
问题:很简单,我想在after_update回调期间访问原始值.你有什么方法可以做到这一点?
更新:我将采用Luke Francl的想法.在after_update回调期间,您仍然可以访问self.attr_was我想要的值.我还决定使用after_update实现,因为我想在模型中保留这种逻辑.这样,无论我将来如何决定更新交易,我都知道我正在更新交易总和.感谢大家的实施建议.
我有一个表格,当我不想要它们时,根据需要出现几个字段.这是models.py的表单
class CircuitForm(ModelForm):
class Meta:
model = Circuit
exclude = ('lastPaged',)
def __init__(self, *args, **kwargs):
super(CircuitForm, self).__init__(*args, **kwargs)
self.fields['begin'].widget = widgets.AdminSplitDateTime()
self.fields['end'].widget = widgets.AdminSplitDateTime()
Run Code Online (Sandbox Code Playgroud)
在实际的Circuit模型中,字段定义如下:
begin = models.DateTimeField('Start Time', null=True, blank=True)
end = models.DateTimeField('Stop Time', null=True, blank=True)
Run Code Online (Sandbox Code Playgroud)
我的views.py就在这里:
def addCircuitForm(request):
if request.method == 'POST':
form = CircuitForm(request.POST)
if form.is_valid():
form.save()
return HttpResponseRedirect('/sla/all')
form = CircuitForm()
return render_to_response('sla/add.html', {'form': form})
Run Code Online (Sandbox Code Playgroud)
我该怎么办才能不需要这两个字段?
我发现Angular对模型的使用令人困惑.Angular似乎采用了一种模型可以是你喜欢的方法 - IE Angular不包含显式模型类,你可以使用vanilla JavaScript对象作为模型.
在我见过的几乎所有Angular示例中,模型实际上都是一个对象,可以手工创建,也可以通过资源从API调用返回.因为我所看到的几乎每个Angular示例都很简单,通常存储在控制器中$ scope上的模型数据以及与模型相关的任何状态(例如选择)也存储在控制器中的$ scope中.这适用于简单的应用程序/示例,但是当应用程序变得更加复杂时,这似乎过于简单了.例如,存储在控制器中的模型状态存在变为上下文的风险并且如果上下文改变则丢失.控制器存储selectedGallery并且selectedPhoto只能存储全局selectedImage,而不是selectedPhoto每个库.在这种情况下,每个图库使用一个控制器可能会否定这个问题,但从UI的角度来看,这似乎是浪费的,可能是不恰当和不必要的.
Angular对模型的定义似乎更接近我所认为的VO/DTO,它是服务器和客户端之间传递的愚蠢对象.我的直觉是将这样的对象包装在我认为的模型中 - 一个维护与DTO/VO相关的状态的类(例如选择),根据需要提供操纵DTO/VO的变换器,并通知其余的应用对基础数据的更改.很明显,最后一部分很好地由Angular的绑定处理,但我仍然看到前两个职责的强大用例.
但是我没有真正看到我看过的例子中使用的这种模式,但我也没有看到我认为可扩展的替代方案.Angular似乎暗中不鼓励使用服务作为模型,通过强制执行Singletons(我知道有办法解决这个问题,但它们似乎没有得到广泛使用或批准).
那么我应该如何保持模型数据的状态呢?
[编辑] 这个问题的第二个答案很有趣,接近我目前正在使用的内容.
我需要通过id类似的东西查询SQLAlchemy数据库
User.query.filter_by(用户名= '彼得')
但对于身份证.我该怎么做呢?[搜索Google和SO没有帮助]
我有一个具有:credits属性的User模型.我想要一个简单的按钮,通过一个名为"add"的路由将5添加到用户的信用点,这样/ users/3/add会将5添加到用户id = 3的信用点.
def add
@user = User.find(params[:id])
@user.credits += 5
redirect_to root_path
end
Run Code Online (Sandbox Code Playgroud)
这是我的控制器的相关部分.问题是,我不想调用@ user.save,因为我有一个before_save回调,它根据当前的UTC时间重新加密用户的密码.我只想简单地为属性添加5并避免回调,我从未想过这么简单的事情会如此困难.
编辑:
我将回调更改为:before_create,这是我的新控制器代码(相关部分):
def add
@user = User.find(params[:id])
@user.add_credits(5)
@user.save
flash[:success] = "Credits added!"
redirect_to root_path
end
Run Code Online (Sandbox Code Playgroud)
这是我在模型中的代码:
def add_credits(num)
self.credits = num
end
Run Code Online (Sandbox Code Playgroud)
编辑2:
好吧,这是一个验证问题,使"编辑"中的更改无法正常工作,但我仍然喜欢在没有回调的情况下更新原始问题的答案!
我有一个带功能的模块.它位于/lib/contact.rb中:
module Contact
class << self
def run(current_user)
...
end
end
end
Run Code Online (Sandbox Code Playgroud)
我想访问模块中的'users_path'之类的URL帮助程序.我怎么做?
我正在寻找一种以图形方式表示我的Django项目模型的方法.
是否有一些应用程序可以执行此类ERD(图表)?
按照@Etienne说明进行更新
以下是我最终查看代表我的django项目的某些模型的PDF的示例
$ python manage.py graph_models app1 app2 ... | dot -Tpdf | evince
Run Code Online (Sandbox Code Playgroud)
dot给输出为PDF格式evince我正在使用Eloquent ORM laravel 5.1,我想返回一个大于0的id数组,我的模型叫做test.
我试过了 :
$test=test::select('id')->where('id' ,'>' ,0)->get()->toarray();
Run Code Online (Sandbox Code Playgroud)
它返回:
Array ( [0] => Array ( [id] => 1 ) [1] => Array ( [id] => 2 ) )
Run Code Online (Sandbox Code Playgroud)
但我希望结果是简单的数组,如:
Array ( 1,2 )
Run Code Online (Sandbox Code Playgroud) model ×10
ruby ×3
callback ×2
django ×2
python ×2
activerecord ×1
angularjs ×1
attributes ×1
cakephp ×1
controller ×1
diagram ×1
eloquent ×1
erd ×1
forms ×1
helper ×1
javascript ×1
laravel ×1
laravel-5 ×1
php ×1
sql ×1
sqlalchemy ×1
state ×1
url ×1
validation ×1
widget ×1