Обновление модели «один ко многим» RoR - PullRequest
0 голосов
/ 15 июля 2010

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

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

Так что, когда они нажимают кнопку «Изменить» и делают обновление, если стоимость лечения должна была измениться, я затем хочу обновить таблицу затрат.У меня проблема с моделями, представленными в форме.

<% form_for([:admin, @treatment]) do |f| %>
  <%= f.error_messages %>

  <p>
    <%= f.label :name %><br />
    <%= f.text_field :name %>
  </p>
  <p>
    <%= f.label :description %><br />
    <%= f.text_field :description %>
  </p>
  <p>
    <%= f.label :duration %><br />
    <%= f.text_field :duration %>
  </p>
  <p>
    <%= f.submit 'Save' %>
  </p>
<% end %>

Итак, обработка has_many: стоимость в модели, и в этой форме я хочу, чтобы в поле стоимости была указана последняя стоимость.Для начала, как мне это сделать?Кроме того, как обновить модель затрат, если стоимость изменилась?Я предполагаю, что это сделано в контроллере, но если у меня есть текстовое поле для стоимости, как мне отсоединить его с моделью @treatment?

Cheers

1 Ответ

0 голосов
/ 16 июля 2010

У меня была похожая проблема, поэтому у меня была ассоциация has_many, но затем у меня была ассоциация has_one, указывающая на самую последнюю версию.

ПРИМЕЧАНИЕ. Я использую MSSQL, поэтому ваш синтаксисможет быть немного по-другому.

class Treatment < ActiveRecord::Base
  has_many :costs
  has_one :current_cost, :class_name => "Cost", 
                         :conditions => "costs.id = (SELECT MAX(c.id) 
                                                            FROM costs c
                                                            WHERE c.treatment_id = costs.treatment_id)"
end

Я начал с этого:

class Treatment < ActiveRecord::Base
  has_many :costs

  def current_cost
    self.costs.last(:order => "id")
  end
end

Но после того, как он стал достаточно большим, мне нужно было минимизировать провалы базы данных, и это становилось узким местом.

Если у вас была возможность установить поле enabled в модели затрат и использовать проверку, чтобы убедиться, что для каждой процедуры включена только одна стоимость.Тогда я бы порекомендовал:

class Treatment < ActiveRecord::Base
  has_many :costs
  has_one :current_cost, :class_name => "Cost", :conditions => ["costs.enabled = ?", true]
end

Надеюсь, это поможет!

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