标签: model

胖模型,瘦控制器和MVC设计模式

我刚看了一篇博客文章,用银行类比来解释MVC.我有几个月使用MVC框架(CakePHP)进行Web应用程序开发的经验,所以我得到了基础知识,但我开始看到一个主题让我觉得我采用了一种有缺陷的方法来处理逻辑:

  • 胖子模特,瘦小的控制器
  • 尽可能在模型中保留尽可能多的业务逻辑

在我的应用程序中,模型是厌食症,控制器是肥胖的.我在控制器中有所有业务逻辑,除了模型中的关联和验证规则之外什么也没有.

通过我的控制器扫描,我现在可以识别出许多应该放在模型中的逻辑:

  • 该应用程序具有包含项目的列表,并且可以对项目进行排名.将列表按排名顺序排列的排序逻辑位于控制器中.
  • 同样,项目(项目模型)也有图像(图像模型).每个项目可能有一个默认图像(由items表中的image_id指定).当项目与其图像一起显示时,应首先显示默认图像.我有一个在控制器中执行此操作的逻辑.
  • 显示列表时,相关列表将显示在侧栏中.确定哪些列表相关的逻辑在控制器中.

现在问我的问题:

  1. 通过上面给出的示例,我是否正确地认为那些是属于模型的控制器中的逻辑实例?
  2. 应该进入模型的网络应用程序常见的其他逻辑领域是什么?
  3. 我确定发现这个问题并且改变我的设计模式是成功的一半,但即使我决定采用上面提到的那些例子并尝试将该逻辑移到模型中,我也不知道从哪里开始.任何人都可以通过在这里发布一些代码或链接到一些好的学习资源来指出我正确的方向吗?CakePHP特定的帮助会很棒,但我确信任何MVC都足够了.

model-view-controller controller cakephp model

75
推荐指数
2
解决办法
1万
查看次数

验证字符串的最小和最大长度,但允许它为空

我有一个我想验证的字段.我希望该字段可以留空,但如果用户输入数据,我希望它以某种格式.目前我在模型中使用以下验证,但这不允许用户将其留空:

validates_length_of :foo, :maximum => 5
validates_length_of :foo, :minimum => 5
Run Code Online (Sandbox Code Playgroud)

我如何写这个来实现我的目标?

ruby validation model ruby-on-rails

75
推荐指数
4
解决办法
7万
查看次数

使用ActiveRecord,有没有办法在after_update期间获取记录的旧值

使用一个简单示例进行设置:我有一个table(Totals),它保存amount第二个表(Things)中每个记录的列的总和.

thing.amount更新时,我想简单地添加旧值和新值之间的差异total.sum.

现在我正在减去self.amount期间before_updateself.amount在期间添加after_update.这使得WAY过于信任更新成功.

约束: 我不想简单地重新计算所有交易的总和.

问题:很简单,我想在after_update回调期间访问原始值.你有什么方法可以做到这一点?

更新:我将采用Luke Francl的想法.在after_update回调期间,您仍然可以访问self.attr_was我想要的值.我还决定使用after_update实现,因为我想在模型中保留这种逻辑.这样,无论我将来如何决定更新交易,我都知道我正在更新交易总和.感谢大家的实施建议.

activerecord model ruby-on-rails callback

74
推荐指数
6
解决办法
4万
查看次数

Django需要模型形式的字段

我有一个表格,当我不想要它们时,根据需要出现几个字段.这是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)

我该怎么办才能不需要这两个字段?

python forms django model widget

71
推荐指数
3
解决办法
7万
查看次数

模型状态应该存储在Angular.js中

我发现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(我知道有办法解决这个问题,但它们似乎没有得到广泛使用或批准).

那么我应该如何保持模型数据的状态呢?

[编辑] 这个问题的第二个答案很有趣,接近我目前正在使用的内容.

javascript state model angularjs

71
推荐指数
3
解决办法
2万
查看次数

如何使用SqlAlchemy通过id查询数据库?

我需要通过id类似的东西查询SQLAlchemy数据库

User.query.filter_by(用户名= '彼得')

但对于身份证.我该怎么做呢?[搜索Google和SO没有帮助]

python sql model sqlalchemy

70
推荐指数
3
解决办法
6万
查看次数

Rails:更新模型属性而不调用回调

我有一个具有: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:

好吧,这是一个验证问题,使"编辑"中的更改无法正常工作,但我仍然喜欢在没有回调的情况下更新原始问题的答案!

ruby attributes model ruby-on-rails callback

69
推荐指数
4
解决办法
5万
查看次数

如何从rails模块访问URL帮助程序

我有一个带功能的模块.它位于/lib/contact.rb中:

module Contact
  class << self
    def run(current_user)
      ...
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

我想访问模块中的'users_path'之类的URL帮助程序.我怎么做?

ruby url model ruby-on-rails helper

66
推荐指数
4
解决办法
4万
查看次数

Django - 模型图形表示(ERD)

我正在寻找一种以图形方式表示我的Django项目模型的方法.

是否有一些应用程序可以执行此类ERD(图表)?


按照@Etienne说明进行更新

以下是我最终查看代表我的django项目的某些模型的PDF的示例

$ python manage.py graph_models app1 app2 ... | dot -Tpdf | evince
Run Code Online (Sandbox Code Playgroud)
  • 它实际上用我的应用程序生成点数据(app1,app2,...)
  • 将结果传递dot给输出为PDF格式
  • 打开输出 evince

django diagram erd model

66
推荐指数
2
解决办法
4万
查看次数

雄辩的ORM laravel 5获取ID数组

我正在使用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)

php model laravel eloquent laravel-5

65
推荐指数
7
解决办法
9万
查看次数