Ваш счет должен содержать только позиции! Это может быть древовидная структура, но у вас не должно быть товаров, на которые прямо ссылается ваш счет (что, если цена продукта изменится: это повлияет на существующие счета!)
Итак, чтобы исправить вашу структуру:
invoice
line_item # references a product, but has its own fields (price!)
line_item
line_item
Каждый line_item
должен ссылаться на один продукт, используя belong_to
. Это ваша модель соединения между счетами и продуктами:
class Invoice
has_many :line_items
end
class LineItem
belongs_to :invoice
belongs_to :product
acts_as_tree # (implies has_many :line_items with the parent invoice_id, etc.)
end
class Product
has_many :line_items
end
Это в основном все, что вам нужно для создания счета. Вы можете думать о древовидной структуре как о не зависящей от отношения Invoice:LineItem:Product
. Он может работать как плоский список или улучшаться, чтобы стать деревом.
Если ваши продукты обычно содержат другие продукты, и вам необходимо знать, какие дочерние элементы добавляются в счет-фактуру при добавлении родительского продукта (в виде позиций), вам также необходимо создать свои продукты в виде дерева:
class Product
has_many :line_items
acts_as_tree
end
Эта древовидная структура не зависит от древовидной структуры в позициях. Помните: товары могут меняться, и это не должно влиять на существующие позиции в ваших счетах.