5

Tôi có hệ thống lập hóa đơn quản lý ghi nợ và ghi có. Về cơ bản số tiền hóa đơn thu được bằng tổng số tiền ghi nợ của nó và số dư có được bằng cách lấy tổng các khoản tín dụng của nó và trừ đi số tiền đó so với tổng số tiền.Tên/loại đường ray không hoạt động đối với một đa hình has_many: thông qua

Tôi đang làm điều này với bốn kiểu máy.

  1. Invoice
  2. mục dòng
  3. Debit
  4. Credit

Cách nó hoạt động là thông qua một tham gia mô hình (Line Item) mà có một hiệp hội đa hình được gọi là ghi. Mọi thứ dường như hoạt động bình thường ngay từ cái nhìn đầu tiên. Tuy nhiên, việc kiểm tra mục hàng cho thấy rằng trong khi recordable_id hiển thị không sao, recordable_type là không.

Dưới đây là bảng phân tích về mã:

class Invoice < ActiveRecord::Base 
    has_many :line_items, :dependent => :destroy 
    has_many :debits, :through => :line_items, :as => :recordable 
    has_many :credits, :through => :line_items, :as => :recordable 
end 

class LineItem < ActiveRecord::Base 
    belongs_to :invoice 
    belongs_to :recordable, :polymorphic => true 
    belongs_to :credit, :class_name => "Credit", :foreign_key => "recordable_id" 
    belongs_to :debit, :class_name => "Debit", :foreign_key => "recordable_id" 
end 

class Credit < ActiveRecord::Base 
    has_many :line_items, :as => :recordable, :dependent => :destroy 
end 

class Debit < ActiveRecord::Base 
    has_many :line_items, :as => :recordable, :dependent => :destroy 
end 

bất cứ ai có thể điểm tôi vào đúng hướng ở đây?

+0

Bạn chỉ định line_items cho tín dụng/ghi nợ như thế nào? – Nazar

+0

Điều này xảy ra tự động thông qua has_many: thông qua. Vì vậy, khi bạn làm Invoice.last.credits << Credit.new the LineItem được tạo tự động và được xây dựng với recordable_id và invoice_id đúng. –

+0

Không nên là ': as' trên' has_many: line_items', không phải là các liên kết 'has_many: through'? – mckeed

Trả lời

3

Bạn đang khai báo các liên kết không rõ ràng trên lớp học LineItem của mình.

Tóm lại, belongs_to thực hiện điều này trong lớp học của bạn:

  1. belongs_to :invoice tạo ra một phương pháp invoice những tìm kiếm các hoá đơn bảng cho một kỷ lục tham chiếu bởi invoice_id
  2. belongs_to :recordable, :polymorphic => true tạo ra một phương pháp recordable những tìm kiếm các recordable_type.underscore.pluralize bảng để lập hồ sơ được tham chiếu bởi recordable_id
  3. belongs_to :credit, :class_name => "Credit", :foreign_key => "recordable_id" tạo một cuộc họp hod credit tìm kiếm thông qua các bảng tín dụng để có bản ghi được tham chiếu bởi recordable_id. Lưu ý rằng recordable_type bị bỏ qua ở đây.
  4. tương tự áp dụng cho belongs_to :debit tương ứng.

Vì LineItem của bạn chỉ có thể thuộc về một khoản tín dụng hoặc một khoản ghi nợ, nên không cần phải khai báo thêm các liên kết này nữa. Bạn có thể tham khảo các thông tin này qua liên kết recordable.

0

Invoice.last.credits < < Credit.new

Đây là cách chính xác trong việc phân công các hiệp hội để tôi bối rối là tại sao recordable_type không được nhặt.

Nắm chặt vào ống hút ở đây nhưng bạn đã thử:

Invoice.last.credits << Credit.create(:value => 1, :date => Time.now, ...) 

Cá nhân tôi đã có vấn đề khi sử dụng đa dạng nhiều-nhiều tham gia bảng trong Rails, mà thường được giải quyết bằng cách sử dụng các plugin has_many_polymorphs .

Rất tiếc, điều này không trực tiếp trả lời câu hỏi của bạn.

+0

Vâng, tôi đã kết thúc việc tạo mối quan hệ trực tiếp vì hành vi của ứng dụng không còn cần đến nhiều mối quan hệ của hóa đơn để ghi nợ nữa. Tôi không chắc chắn tại sao nó không nhặt nó lên hoặc là mặc dù. Tôi đã thực hiện cùng một thiết lập chính xác cho các đối tượng khác nhau trong quá khứ. Có lẽ tôi đã vấp phải một cái tên được bảo vệ nhưng tôi không thể nghĩ ra được. Ban đầu tôi đã sử dụng item_id và item_type nhưng ngay cả sau khi thay đổi thành recordable_id và gõ nó vẫn không hoạt động. Hoàn toàn bối rối. –

Các vấn đề liên quan