has_many и дополнительные данные: count - PullRequest
1 голос
/ 11 января 2011

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

Schema

class Element < ActiveRecord::Base
   has_many :connections
   has_many :connector_types, :through => :connections
end

class ConnectorType < ActiveRecord::Base
  has_many :connections
  has_many :elements, :through => :connections
end

class Connection < ActiveRecord::Base
  belongs_to :element
  belongs_to :connector_type
end

Когда я добавляюConnectorType to Element:

  • A Connection должен быть создан, если для этого нет ConnectorType
  • Если Connection для этого ConnectorType существует, Connection#number должно быть увеличено

Когда я удаляю ConnectorType из Element:

  • Connection#number должно быть уменьшением.
  • Если Connection#number == 0 удалить Connection

Я новичок в рельсах Я не знаю, как это сделать на Rails:

  • Обратный звонок
  • Создайте дамп числового поля и сохраните как повторяющиеся строки в модели объединения.
  • ...

1 Ответ

2 голосов
/ 11 января 2011

Если я хорошо понимаю, вы хотите отслеживать количество соединений между данным элементом и данным типом_коннектора, но не хотите иметь дубликаты объектов подключения в вашей базе данных?

Вы можете использовать обратные вызовы дляthis (код не тестировался)

# connection.rb 
before_create  :bc_callback
before_destroy :bd_callback


private
def before_create
  if (existing_connection = self.find_by_element_id_and_connector_type_id(element_id, connector_type_id))
    existing_connection.number++
    existing_connection.save
    return false # Do not create a new connection object
  end
end

def before_destroy
  number--
  # If you still have 1 connection or more, the object won't be destroyed
  if (number > 0)
    save
    return false
  end
end

Однако я не уверен, что добавление тип_коннектора к элементу через отношение has_many, подобное этому:

@element.connector_types << @connector_type

вызовет созданиеновое соединение, если уже существует одно связывание этого элемента и этого типа соединителя ...

...