Один контроллер с несколькими моделями?Я делаю это правильно? - PullRequest
5 голосов
/ 12 июня 2010

Мое веб-приложение до этого момента было довольно простым.У меня есть пользователи, контакты, встречи и несколько других вещей для управления.Все это легко - это просто одна модель на раздел, поэтому я просто создал скаффолд для каждого, а затем изменил код скаффолда в соответствии со своими потребностями.Довольно просто ...

К сожалению, у меня возникла проблема с этим следующим разделом, потому что я хочу, чтобы раздел «Финансы» моего приложения был более глубоким, чем другие разделы, которые я просто создал.Например, когда пользователь нажимает ссылку «Контакты» на панели навигации, он просто показывает список контактов, довольно прямой и соответствует эшафоту.Однако, когда пользователь нажимает ссылку «Финансовые показатели» на панели навигации, я хочу показать банковские счета в левой части страницы и несколько транзакций в правой части.

Таким образом, на вкладке «Финансовые показатели» появитсяв основном работают с данными из двух моделей: транзакции и bank_accounts.Я думаю Я должен создать модели (транзакции и bank_accounts), а затем создать контроллер под названием Financials, затем я могу запросить модели из контроллера Financials и отобразить страницы в приложении / views / financials /

Я прав в этом макете приложения?Я никогда не работал с основами строительных лесов, поэтому хочу убедиться, что я правильно понял!

Спасибо!

Ответы [ 3 ]

4 голосов
/ 12 июня 2010

Если вам не безразличны скаффолдинг, я бы посоветовал вам создать эшафот для транзакций

: script/generate scaffold transaction financial_id:integer ...

bank_accounts: script/generate scaffold bank_account financial_id:integer ...

и финансовых показателейscript/generate scaffold financials ...

Добавьте в свою модель транзакций следующее:

class Transaction < ActiveRecord::Base
  belongs_to :financial
end

Добавьте в свою модель bank_account следующее:

class Bank_account < ActiveRecord::Base
  belongs_to :financial
end

Добавьте в свою финансовую модель:

class Financial < ActiveRecord::Base
  has_many :transactions
  has_many :bank_accounts
end

Теперь из вашего финансового диспетчера вы можете использовать что-то вроде этого:

def index
  @financial = Financial.find(params[:id])

  #This fetches all bank_accounts related to financial
  @bank_accounts = @financial.bank_accounts

  #This fetches all transactions related to financial
  @transactions = @financial.transactions
end

В ваших представлениях вы можете просматривать все банковские счета, принадлежащие определенному финансовому инструменту, просто делая это:

<% @bank_accounts.each do |bank_account| -%>
   <%=h bank_account.something_here %> <!-- something_here is the column name corresponding to your bank_account table.  -->
   <%=h bank_account.something_here %> <!-- something_here is the column name corresponding to your bank_account table.  -->
   <%=h bank_account.something_here %> <!-- something_here is the column name corresponding to your bank_account table.  -->
   .
   .
   .
<% end -%>

В своих представлениях вы можете просмотреть все транзакции, относящиеся к определенному финансовому документу, добавив что-то похожее:

<% @transactions.each do |transaction| -%>
   <%=h transaction.something_here %> <!-- something_here is the column name corresponding to your bank_account table.  -->
   <%=h transaction.something_here %> <!-- something_here is the column name corresponding to your bank_account table.  -->
   <%=h transaction.something_here %> <!-- something_here is the column name corresponding to your bank_account table.  -->
   .
   .
   .
<% end -%>

Помните, что при создании новой транзакции / банковского счета используйте идентификаторпринадлежность к конкретному финансовому.Надеюсь это поможет.Ура!:)

1 голос
/ 12 июня 2010

Для меня это звучит так, как будто вы хотите два просмотра:

Однако, когда пользователь нажимает ссылку «Финансовые показатели» на панели навигации, я хочу показать банковские счета слева отстраница и несколько транзакций справа. транзакции справа.

Имейте в виду, что один экран не всегда означает одно представление в MVC.Концептуально представление просто отображает данные модели, чтобы пользователь мог сделать что-то значимое с помощью действий контроллера.Rails немного запутывает это, создавая файл в каталоге views / для каждого экрана, поэтому легко представить, что один экран означает один просмотр.Однако вы также можете вызывать макеты в представлениях в Rails, и эти макеты сами являются представлениями.

Размещение транзакций и учетных записей в отдельных представлениях означает, что у каждого будет контроллер для обработки взаимодействия пользователя с каждым сегментом данных.Например, контроллер учетной записи будет обрабатывать событие, когда пользователь выбирает учетную запись для просмотра дополнительной информации об учетной записи.Это приведет к извлечению транзакций для отображения пользователю.Затем пользователь может взаимодействовать с транзакцией в попытке согласовать, аннулировать или оспорить ее.Это вызвало бы логику в контроллере транзакций.

Хотя это и делает хорошую работу по удалению соединения из ваших контроллеров, может показаться, что оно связывает два представления.Однако связь является односторонней: список учетных записей включает в себя логику, специфичную для представления транзакции (т.е. обновляет ее при выборе учетной записи).Представление транзакции остается повторно используемым в других областях приложения.По большей части список учетных записей также можно использовать повторно, особенно если вы изолируете его в отдельный макет.Единственное отличие, которое вам понадобится для этого конкретного экрана, - это обработка, когда пользователь нажимает на учетную запись.

Если вы объедините все в представление финансовых данных, все еще возможно сохранить слабую связь, но этостановится все труднее сделать это.Дополнительный слой требует дополнительных усилий и может подсознательно привести вас к объединению всего воедино.

Конечно, любой способ работает, и вы можете легко утверждать, что окончательный дизайн - это упражнение, которое лучше оставить на усмотрение разработчика.,Я просто предлагаю свою интерпретацию того, как наиболее точно придерживаться шаблонов, которые Rails пытается направить разработчикам.

0 голосов
/ 12 июня 2010

У меня нет большого опыта работы с Ruby on Rails или MVC в целом, но я думаю, что вы делаете это правильно.Обычно вам нужен объект модели (и, соответственно, таблица базы данных) для ориентированных на данные ресурсов ... То есть ваши модели должны соответствовать вашим "существительным".Действия вашего контроллера - это ваши «глаголы», и для меня имеет смысл классифицировать их так, как вам нравится.

В этом случае я бы сказал, что установка группы «глаголов» под financials, чтовзаимодействовать с двумя типами объектов по мере необходимости, имеет смысл ЕСЛИ И ТОЛЬКО ЕСЛИ для вас имеет смысл организовать его таким образом.(Имейте в виду, что вы также можете оценить, насколько хорошо организованные и интуитивно понятные вам соответствующие URL-адреса, хотя я уверен, что большинство пуристов MVC добавят, что вам никогда не следует полагаться только на изучение URL-адресов!)

Итакв общем, я думаю, что вы делаете все прямо здесь, если это имеет смысл для вас.Да, вам придется написать свои представления и действия контроллера самостоятельно, хотя вы можете начать использовать ruby script/generate controller financials action1 action2 [...];это, по крайней мере, дает вам скелеты файлов просмотра и действий пустого контроллера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...