2010-02-23 43 views
1
查看

我从.NET的背景,它是一种实践,以不直接绑定域/实体模型中不那么基本CRUD-认为未来ish应用程序,其中视图不直接按原样投影实体字段。数据传输对象VS域/ ActiveRecord的实体在回报率

我不知道什么是在回报率,其中默认的持久性机制是ActiveRecord的做法。我会断言演示相关的信息不应该泄露给实体,但不确定如果这是真正的RoR头将如何做到这一点。

如果每个视图的DTO /模型的方法,你将如何做它在Rails的?

您的想法?

编辑:

一些例子:
- 甲视图显示发票的列表,具有独特的项目在一列中的数目。
- 信用卡账户列表,可能存在欺诈交易。为此,UI需要以红色显示此行。

对于这两种情况,列表并不显示实体的所有字段,只显示列表中的几个字段(如发票号,交易日期,账户名称,交易金额)

对于发票示例,发票实体没有映射其上的字段“订单项数”字段。该数据库由于性能原因未被非规格化,并且将在使用聚合函数的查询时间内计算。

对于信用卡账户例子,想必卡交易的实体不具有“显示,在红色”或“IsFraudulent”不变。是的,这可能是一个商业规则,但对于这个例子来说,这是一个介绍问题,所以我想让它远离我的领域模型。

+0

我不来自.NET的背景,也许我不是这样很好 - 我不明白你的问题。你能举一些例子吗? – klew 2010-02-23 23:24:34

+0

我发现你的问题非常有用,清晰并且专注,但是我不认为_DTO_是你描述的正确的术语。 DTO是_Data Transfer Object_,它是客户端 - 服务器体系结构中用于在客户端和服务器之间交换的通信对象的术语,而您所描述的内容通常称为_ViewModel_,即为绑定而定制的模型一个看法。 – 2014-02-13 17:36:57

回答

1

一般来说,我会回答你的AcitveRecord对象可以包含任何字段,并且您在视图中显示只想要什么。脚本脚本中有脚手架任务,但只能创建一些设置模型,控制器和视图。当我使用Rails时,我根本不使用./script/generate scaffold。相反,我只是分别生成模型和控制器。视图部分我添加manualy。

ActiveRecord的唯一地图从数据库到一些不错的对象的数据。你用它来做什么取决于你。

根据演示文稿和业务规则之间的分离,我认为下面的例子会让你清楚如何在Rails中处理它。

对于发票的例子,我将创建一个视图是这样的:

<h1>Invoices</h1> 
<table> 
    <tr> 
    <th>Invoice #</th> 
    <th>Date</th> 
    <th>Name</th> 
    <th>No. of line items</th> 
    etc 
    </tr> 
    <% @invoices.each do |invoice| %> 
    <tr> 
     <td><%= invoice.number %></td> 
     <td><%= invoice.date.to_s %></td> 
     <td><%= invoice.name %></td> 
     <td><%= invoice.line_items.count %></td> 
     etc. 
    </tr> 
    <% end %> 
</table> 

甚至把带发票数据的行成独立的部分,呈现在上述观点。我假设你的模型中有:

# Invoice model 
has_many :line_items 

现在让我们来看看信用卡示例。当你使这个信用卡

# In CreditCard model add method 
def fraudulent? 
    #put here some logic that returns true or false 
end 

然后在您的视图:

<div <%= @credit_card.fraudulent? ? 'class="show_in_red"' : '' %> 
    here you can show whatever you want 
</div> 

甚至创造帮手吧:

# credit card helper 
def add_show_in_red(credit_card) 
    credit_card.fraudulent? ? 'class="show_in_red"' : '' 
end 

# in Rails 3 or earlier version with plugin that puts `h` method by default 
# your helper should have additional safe_html! call 
def add_show_in_red(credit_card) 
    (credit_card.fraudulent? ? 'class="show_in_red"' : '').safe_html! 
end 

,并鉴于我会做这样的:

<div <%= add_show_in_red(@credit_card) %>> 
    here you can show whatever you want 
</div> 
+0

如果数据相对较小,则访问invoice.line_items.count即可。在儿童实体列表巨大的情况下,它肯定会对性能产生巨大影响。 credit_card.fraudulent是我试图阻止的一个,如果我有多个使用credit_card实体的用例,这会强制我将所有与演示文稿相关的逻辑代码放入我的实体中,从而使我的实体变得“脏”用户界面,关注。例如,在更新信用卡使用案例中,我不需要欺诈标志。这会导致班级变得无法控制,因为每个人都可以为其增加不变量。 – leypascua 2010-02-25 03:55:51

+0

要计数可以使用'counter_cache'的项目 - 它会将计数存储在父对象中,所以它不会对数据库造成任何额外负载。据我了解这'credit_card.fraudulent' - 它不是演示文稿。这是信用卡的某种'状态',所以它属于模型(据我所知)。在Rails中,ActiveRecord对象总是很大,并且包含很多我不使用的东西。据我所知,Rails的“世界”人并不关心它。如果你不需要在某个视图中使用'credit_card.fraudulent',那么就忽略它,假装它不在这里。但是如果你真的想分开它,比添加所有的逻辑给帮手 – klew 2010-02-25 10:19:19

+0

但是对我来说它会不必要地破坏MVC – klew 2010-02-25 10:20:24