Ruby on rails RoR视图中的数据传输对象与域/ActiveRecord实体

Ruby on rails RoR视图中的数据传输对象与域/ActiveRecord实体,ruby-on-rails,rails-activerecord,Ruby On Rails,Rails Activerecord,我来自.NET背景,在不太基本的CRUD ish应用程序中,不将域/实体模型直接绑定到视图是一种实践,在这种应用程序中,视图不会直接投影实体字段 我想知道RoR的做法是什么,默认的持久性机制是ActiveRecord。我认为不应将演示文稿相关信息泄露给实体,但不确定RoR负责人是否会这样做 如果DTO/模型/视图是一种方法,那么您将如何在Rails中实现它 你的想法 编辑: 一些例子: -视图显示发票列表,在一列中显示唯一项目的数量。 -信用卡账户清单,其中可能存在欺诈交易。为此,UI需要将此行

我来自.NET背景,在不太基本的CRUD ish应用程序中,不将域/实体模型直接绑定到视图是一种实践,在这种应用程序中,视图不会直接投影实体字段

我想知道RoR的做法是什么,默认的持久性机制是ActiveRecord。我认为不应将演示文稿相关信息泄露给实体,但不确定RoR负责人是否会这样做

如果DTO/模型/视图是一种方法,那么您将如何在Rails中实现它

你的想法

编辑:

一些例子:
-视图显示发票列表,在一列中显示唯一项目的数量。
-信用卡账户清单,其中可能存在欺诈交易。为此,UI需要将此行显示为红色

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

对于发票示例,发票实体上没有映射“行项目数”字段。由于性能原因,数据库尚未被非规范化,它将在查询期间使用聚合函数进行计算


以信用卡账户为例,信用卡交易实体肯定没有“以红色显示”或“IsFraudial”不变量。是的,这可能是一个业务规则,但在本例中,这是一个表示问题,因此我希望将其排除在我的域模型之外。

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

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>
现在让我们来看看信用卡的例子。我会这样做:

# 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>
鉴于:

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

在这里你可以展示你想要的任何东西

一般来说,我会回答您的AcitveRecord对象可以包含任何字段,并且您只能在视图中显示所需的内容。rails脚本中有脚手架任务,但它只是创建一些设置模型、控制器和视图。当我使用Rails时,我根本不使用
/script/generate scaffold
。相反,我只单独生成模型和控制器。视图部分我手动添加

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>
现在让我们来看看信用卡的例子。我会这样做:

# 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>
鉴于:

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

在这里你可以展示你想要的任何东西

我不是.NET出身,也许我的教育水平不高——我不理解你的问题。你能举一些例子吗?我发现你的问题非常有用、清晰和准确,但是我认为DTO不是你所描述的正确术语。DTO是一种数据传输对象,它是客户机-服务器体系结构中用于在客户机和服务器之间交换的通信对象的术语,而您所描述的通常称为ViewModel,例如,一个为视图绑定而定制的模型。我不是.NET背景,也许我没有受过很好的教育-我不理解你的问题。你能举一些例子吗?我发现你的问题非常有用、清晰和准确,但是我认为DTO不是你所描述的正确术语。DTO是一种数据传输对象,它是客户机-服务器体系结构中用于在客户机和服务器之间交换的通信对象的术语,而您所描述的通常称为ViewModel,即为视图绑定而定制的模型。如果数据相对较小,则访问invoice.line_items.count是可以的。在子实体列表庞大的场景中,它肯定会对性能产生巨大影响。credit_card.Fragical是我试图阻止的,如果我有多个使用credit_card实体的用例,这将迫使我将所有与表示相关的逻辑代码放入实体中,使我的实体在UI中“脏”了。例如,在更新信用卡用例中,我不需要欺诈标志。这将导致类无法控制地变大,因为每个人都可以向其添加不变量。若要计算项目数,可以使用
计数器\u缓存
-它将计数存储在父对象中,因此不会对数据库造成任何额外的负载。据我所知,这张信用卡是欺诈性的,它不是演示文稿。这是信用卡的某种“状态”,所以它属于模型(据我所知)。在Rails中,ActiveRecord对象总是相当大,包含许多我不使用的东西。据我所知,Rails的“世界”用户并不关心它。如果你不需要在某些视图中使用信用卡。欺诈,那么就忽略它,假装它不在这里。但是如果你真的想把它分开,就添加所有逻辑来帮助它,但对我来说,它会不必要地破坏MVCcredit_卡。欺诈是一个不变量-每次访问它时都会计算它的值。在本例中,是的,它不是自.fr以来的演示文稿