Объекты передачи данных VS Домен / объекты ActiveRecord в представлении в RoR - PullRequest
1 голос
/ 24 февраля 2010

Я исходил из .NET, где практикуется не привязывать модели доменов / сущностей непосредственно к представлению в не столь базовых приложениях CRUD, где представление напрямую не проецирует поля сущностей какis.

Мне интересно, какова практика в RoR, где механизм постоянства по умолчанию - ActiveRecord.Я бы утверждал, что информация, связанная с презентацией, не должна передаваться объектам, хотя я не уверен, что именно так поступят настоящие руководители RoR.

Если подходом являются DTO / модель для представления, как вы будете это делать?это в Rails?

Ваши мысли?

РЕДАКТИРОВАТЬ:

Некоторые примеры:
- Представление показывает список счетов, сколичество уникальных элементов в одном столбце.
- Список учетных записей кредитных карт, на которых, возможно, были выполнены мошеннические операции.Для этого пользовательский интерфейс должен показать эту строку красным цветом.

Для обоих сценариев списки не отображают все поля сущностей, только некоторые из них должны отображаться в списке (например, invoice #,дата транзакции, имя счета, сумма транзакции)

Для примера счета-фактуры объект счета-фактуры не имеет отображенного поля "Количество позиций".База данных не была денормализована по соображениям производительности, и она будет вычислена во время запроса с использованием агрегатных функций.

Для примера счетов кредитной карты, безусловно, у объекта транзакции по карте нет «Show-in-red»"или" IsFraudulent "инвариант.Да, это может быть бизнес-правило, но для этого примера это проблема презентации, поэтому я хотел бы исключить ее из моей доменной модели.

1 Ответ

1 голос
/ 24 февраля 2010

В общем, я бы ответил, что ваш объект 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>

Или даже поместить строку с данными счета-фактуры в отдельный частичный фрагмент и отобразить его в представлении выше. Я предполагаю, что в вашей модели у вас есть:

# 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>
...