2011-01-11 7 views
1

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

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 к Element:

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

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

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

Я новичок в рельсах я не знаю рельсам способ сделать это:

  • Ответный
  • дамп поле номера и сохранить в виде повторяющихся строк в модели соединения.
  • ...
+0

Что вы хотите, чтобы ваш обратный вызов? У вас есть множество вариантов для этого http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html. Вы заглянули в has_and_belongs_to_many для объединения соединений? –

ответ

2

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

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

# 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 

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

@element.connector_types << @connector_type 

будет инициировать создание нового соединения, если уже есть один связанный этот элемент и этот тип соединителя ...

+0

Это то, что я хочу, но когда я возвращаю false в моем обратном вызове before_create, чтобы избежать создания объекта, вы получили ActiveRecord :: RecordNotSaved –

+0

Не потому, что вы вызываете create! вместо создания или сохранения! вместо сохранения? – MrRuru

Смежные вопросы