has_many: through :: HasManyThroughOrderError - PullRequest
0 голосов
/ 26 апреля 2018

У меня проблема с ActiveRecords и has_many с именем_класса.

У меня есть эти модели:

main_transaction.rb

class MainTransaction < ApplicationRecord
  belongs_to :supplier, :class_name => 'Company'
  belongs_to :recipient, :class_name => 'Company'

  has_many :invoices

end

invoice.rb

class Invoice < ApplicationRecord
    belongs_to :main_transaction
    has_one :recipient, :through => :main_transaction, source: :company
end

company.rb

class Company
    has_many :main_transactions
    has_many :invoices, through: :main_transactions
end

И проблема в том, что, когда я делаю это, выберите в модели счета:

def self.company_filter(companies)
        joins(:main_transaction, :recipient).where("companies.company_name IN (?)", companies )
end

Ошибка:

Could not find the source association(s) :company in model MainTransaction. Try 'has_many :recipient, :through => :main_transaction, :source => <name>'. Is it one of supplier, recipient, invoices, main_transaction_elements, or main_transaction_attachments?

Я пробовал много комбинаций, но все еще не работает ...

Ответы [ 2 ]

0 голосов
/ 27 апреля 2018

Я полагаю, что вам не обязательно указывать какой-либо источник в вашей has_one ассоциации между Invoice и MainTransaction.

В текущем состоянии вашего кода ActiveRecord пытается найти ассоциацию company на MainTransaction, потому что вы заставляете ее с помощью опции source, которую вы используете.

Но у ассоциации has_one :recipient на Invoice уже есть существующий аналог, названный таким же образом на MainTransaction.

Что произойдет, если вы просто удалите source: :company из Invoice?

0 голосов
/ 27 апреля 2018

Вы неправильно указали :source в has_one :recipient в вашей Invoice модели. Вам нужно изменить с :company на :recipient:

class Invoice < ApplicationRecord
  belongs_to :main_transaction
  has_one :recipient, :through => :main_transaction, source: :recipient
end
...