相对较新的rails并尝试使用具有name,gender,father_id和mother_id(2个父项)的单个Person模型来建模一个非常简单的族"树".下面基本上是我想要做的,但显然我不能重复:has_many中的孩子(第一个被覆盖).
class Person < ActiveRecord::Base
belongs_to :father, :class_name => 'Person'
belongs_to :mother, :class_name => 'Person'
has_many :children, :class_name => 'Person', :foreign_key => 'mother_id'
has_many :children, :class_name => 'Person', :foreign_key => 'father_id'
end
Run Code Online (Sandbox Code Playgroud)
是否有一种简单的方法可以将has_many与2个外键一起使用,或者根据对象的性别更改外键?或者还有其他/更好的方式吗?
谢谢!
我已经读过,errors.add_to_base应该用于与对象相关的错误,而不是特定的属性.我无法概念化这意味着什么.有人可以举例说明我何时想要使用它们?
例如,我有一个乐队模型,每个乐队都有一个流派.当我验证某种类型的存在时,如果该类型丢失,是否应该将错误添加到基类中?
越多的例子越好
谢谢!
我知道这可能是一个古老的问题,但更好的做法是什么?在应用程序的所有层中使用域模型对象,甚至在JSP上直接将值绑定到它们(我使用的是JSF).或者将域模型对象转换为DAO或服务层中的DTO,并将轻量级DTO发送到表示层.
我被告知使用DTO是没有意义的,因为对数据库的更改将导致所有DTO的更改,而在任何地方使用模型对象只需要更改受影响的模型对象.然而,DTO的易用性和轻量级特性似乎超过了这一点.
我应该注意我的应用程序使用Hibernate模型对象并使用自己的自定义创建的模型对象(意味着没有绑定到任何数据库会话,总是分离).以上任一方案对严格的模型对象模式更有利吗?对于像Lazy Initialization Exceptions这样的事情,使用Hibernate是一个巨大的PITA.
我正在编辑这个问题,希望能够进一步讨论(不确定我是否正确行事):
我对模型对象的问题在于它们根本不灵活.下面的评论说应该设计应用程序,以便可以在所有层中使用模型对象.为什么?如果用户想要一个荒谬的功能,我应该告诉他们,"好吧,这对模型对象不起作用"?
简单而简单,有时候模型对象不起作用.你可能有:
public class Teacher {
List<Student> students;
[tons of other Teacher-related fields]
}
public class Student {
double gpa;
[tons of other Student-related fields]
}
Run Code Online (Sandbox Code Playgroud)
但也许你不需要所有这些信息.您只需要教师的姓氏,他们今年教授的学生人数,以及所有学生的平均GPA.在那种情况下你会做什么?检索完整的教师信息和学生关系,然后您的代码计入学生列表,然后计算内部所有gpas的总平均值?这似乎比简单地使用'String lastName','int numStudents'和'double combinedGpa'创建DTO更加努力;
听起来好像我已经考虑到了这些,但我还没有在一个应用程序中工作,在这个应用程序中,模型对象可以在每个实例中完全使用.具有不同寻常的用户需求的常规实际应用程序不能以这种方式工作.
我在过去读过一些关于模型的MVC建议,说明你不应该为域和视图重用相同的模型对象; 但我一直没能找到任何人愿意讨论为什么这是不好的.
我认为创建两个独立的模型 - 一个用于域,一个用于视图 - 然后在它们之间进行映射会产生大量重复,加上繁琐的映射代码(其中一些可能会被像AutoMapper这样的东西减轻)很可能容易出错.
是什么让这两个问题的单独模型值得重复和映射代码的麻烦?
有人可以解释这3个概念以及它们之间在MVC框架方面的差异以及一个例子.对我来说,这些似乎几乎相同,似乎它们在某些文章中可互换使用,而在其他文章中则不然.
model-view-controller entity design-patterns model domain-object
我有这样的模型:
class Hop(models.Model):
migration = models.ForeignKey('Migration')
host = models.ForeignKey(User, related_name='host_set')
Run Code Online (Sandbox Code Playgroud)
我想迁移和托管两者是主键.
真的很快速和简单的问题,但我找不到一个合适的答案 - 什么是从控制器传递数据到Magento块的最佳方法.
如果它有所不同,我正在加载布局如下:
$this->loadLayout(array('default', 'myModule_default'));
$this->_initLayoutMessages('customer/session')
->_initLayoutMessages('catalog/session')
->renderLayout();
Run Code Online (Sandbox Code Playgroud)
我应该补充一点,我一直在使用注册表如下:
在控制器中:
Mage::register('data', $data);
Run Code Online (Sandbox Code Playgroud)
在块中:
$data = Mage::registry('data');
Run Code Online (Sandbox Code Playgroud)
不知道这是否是最好的方法.
class TodoList(models.Model):
title = models.CharField(maxlength=100)
slug = models.SlugField(maxlength=100)
def save(self):
self.slug = title
super(TodoList, self).save()
Run Code Online (Sandbox Code Playgroud)
我假设上面是如何在将标题插入表TodoList时如何创建和存储slug,如果没有,请纠正我!
无论如何,我一直在研究pre_save()作为另一种方法,但无法弄清楚它是如何工作的.你如何用pre_save()做到这一点?
是这样的
def pre_save(self):
self.slug = title
Run Code Online (Sandbox Code Playgroud)
我猜不是.这样做的代码是什么?
谢谢!
如果我尝试声明属性,像这样:
public $quantity = 9;
Run Code Online (Sandbox Code Playgroud)
...它不起作用,因为它不被视为"属性",而仅仅是模型类的属性.不仅如此,我还阻止访问实际存在的"数量"属性.
那我该怎么办?
我已经查看了Ruby on Rails指南,我似乎无法弄清楚如果有父级记录,如果有人删除父记录.例如.如果我的数据库有CUSTOMERS并且每个客户可以有多个ORDERS,我想阻止有人在数据库中有任何订单时删除客户.如果客户没有订单,他们应该只能删除客户.
在定义模型之间的关联以强制执行此行为时,有没有办法?