has_many: через не загружающиеся записи - PullRequest
0 голосов
/ 28 августа 2018

У меня есть приложение Rails 5.2.1, где каждый шаг отношений работает, а версия has_many :through - нет. Настройка немного странная, но я чувствую, что все настроил правильно, поэтому я немного озадачен.

Учитывая этот код:

class Contact < SalesforceModel
  self.table_name =  'salesforce.contact'
  self.primary_key = 'sfid'

  has_many :content_accesses, foreign_key: 'contact__c', class_name: 'ContentAccess'
  has_many :concepts, through: :content_accesses, source: :inventory
end

class ContentAccess < ApplicationRecord
  self.table_name =  'salesforce.content_access__c'
  self.primary_key = 'sfid'

  belongs_to :inventory, foreign_key: 'inventory__c', inverse_of: :content_accesses, primary_key: 'sfid', class_name: 'Inventory'
  belongs_to :contact, foreign_key: 'contact__c', inverse_of: : content_accesses, primary_key: 'sfid', class_name: 'Contact'
end

class Inventory < SalesforceModel
  self.table_name = 'salesforce.inventory__c'
  self.primary_key = 'sfid'

  has_many :content_accesses, foreign_key: 'inventory__c'
  has_many :contacts, through: :content_accesses
end

Каждый шаг сквозной работы has_many:

# Setup
2.5.1 :001 > contact = Contact.first
  Contact Load (30.6ms)  SELECT  "salesforce"."contact".* FROM "salesforce"."contact" ORDER BY "salesforce"."contact"."sfid" ASC LIMIT $1  [["LIMIT", 1]]
 => #<Contact lastname: "Doe", mailingpostalcode: "90210", name: "John Doe", mobilephone: nil, birthdate: nil, phone: nil, mailingstreet: "123 ABC Street", isdeleted: false, systemmodstamp: "2018-03-16 00:09:01", mailingstatecode: "CA", createddate: "2018-03-15 17:50:44", mailingcity: "LA", mailingcountrycode: "US", firstname: "John", email: "john.doe@realisp.com", sfid: "003m000000txXhwAAE", id: "003m000000txXhwAAE", _hc_lastop: "SYNCED", _hc_err: nil> 

# Accessing related ContentAccess works
2.5.1 :002 > contact.content_accesses.count
   (2.0ms)  SELECT COUNT(*) FROM "salesforce"."content_access__c" WHERE "salesforce"."content_access__c"."contact__c" = $1  [["contact__c", "003m000000txXhwAAE"]]
 => 2 

# Accessing related Inventory, through the related ContentAccess works
2.5.1 :003 > contact.content_accesses.first.inventory  
  ContentAccess Load (0.6ms)  SELECT  "salesforce"."content_access__c".* FROM "salesforce"."content_access__c" WHERE "salesforce"."content_access__c"."contact__c" = $1 ORDER BY "salesforce"."content_access__c"."sfid" ASC LIMIT $2  [["contact__c", "003m000000txXhwAAE"], ["LIMIT", 1]]
  Inventory Load (30.4ms)  SELECT  "salesforce"."inventory__c".* FROM "salesforce"."inventory__c" WHERE "salesforce"."inventory__c"."sfid" = $1 LIMIT $2  [["sfid", "a1mm0000001S9qzAAC"], ["LIMIT", 1]]
 => #<Inventory createddate: "2018-05-23 15:09:41", isdeleted: false, name: "Some Concept Name", systemmodstamp: "2018-05-23 15:09:42", sfid: "a1mm0000001S9qzAAC", id: "a1mm0000001S9qzAAC", _hc_lastop: "SYNCED", _hc_err: nil> 

# Accessing the related inventory through the has_many :through does not work
2.5.1 :004 > contact.concepts.count
   (33.0ms)  SELECT COUNT(*) FROM "salesforce"."inventory__c" INNER JOIN "salesforce"."content_access__c" ON "salesforce"."inventory__c"."sfid" = "salesforce"."content_access__c"."inventory__c" WHERE "salesforce"."content_access__c"."contact__c" = $1  [["contact__c", "003m000000txXhwAAE"]]
 => 0 

Запуск сгенерированного запроса в Postgres работает, хотя:

app_development=# SELECT COUNT(*) FROM "salesforce"."inventory__c" INNER JOIN "salesforce"."content_access__c" ON "salesforce"."inventory__c"."sfid" = "salesforce"."content_access__c"."inventory__c" WHERE "salesforce"."content_access__c"."contact__c" = '003m000000txXhwAAE';
 count 
-------
     2
(1 row)

Запуск Contact.first.concepts.to_sql создает:

SELECT "salesforce"."inventory__c".* FROM "salesforce"."inventory__c" INNER JOIN "salesforce"."content_access__c" ON "salesforce"."inventory__c"."sfid" = "salesforce"."content_access__c"."inventory__c" WHERE "salesforce"."content_access__c"."contact__c" = '003m000000txXhwAAE'

Выполнение этого запроса через psql работает нормально, возвращая правильные записи из таблицы inventory__c.

Обратное также имеет ту же проблему:

2.5.1 :002 > inventory = Inventory.first
  Inventory Load (30.2ms)  SELECT  "salesforce"."inventory__c".* FROM "salesforce"."inventory__c" ORDER BY "salesforce"."inventory__c"."sfid" ASC LIMIT $1  [["LIMIT", 1]]
 => #<Inventory createddate: "2018-05-23 15:09:41", isdeleted: false, name: "Positive Focus", systemmodstamp: "2018-05-23 15:09:42", inventory_unique_name__c: "Inventory 1", sfid: "a1mm0000001S9qzAAC", id: "a1mm0000001S9qzAAC", _hc_lastop: "SYNCED", _hc_err: nil> 
2.5.1 :003 > inventory.content_accesses.first.contact
  ContentAccess Load (0.9ms)  SELECT  "salesforce"."content_access__c".* FROM "salesforce"."content_access__c" WHERE "salesforce"."content_access__c"."inventory__c" = $1 ORDER BY "salesforce"."content_access__c"."sfid" ASC LIMIT $2  [["inventory__c", "a1mm0000001S9qzAAC"], ["LIMIT", 1]]
  Contact Load (30.9ms)  SELECT  "salesforce"."contact".* FROM "salesforce"."contact" WHERE "salesforce"."contact"."sfid" = $1 LIMIT $2  [["sfid", "003m000000txXhwAAE"], ["LIMIT", 1]]
 => #<Contact sfid: "003m000000txXhwAAE", id: "003m000000txXhwAAE", [...etc...] > 
2.5.1 :004 > inventory.contacts.count
   (30.7ms)  SELECT COUNT(*) FROM "salesforce"."contact" INNER JOIN "salesforce"."content_access__c" ON "salesforce"."contact"."sfid" = "salesforce"."content_access__c"."contact__c" WHERE "salesforce"."content_access__c"."inventory__c" = $1  [["inventory__c", "a1mm0000001S9qzAAC"]]
 => 0 

Итак: кажется, что все правильно подключено, так почему же не работает сквозная версия? Любая помощь будет оценена.

Спасибо! ❤️

1 Ответ

0 голосов
/ 05 сентября 2018

Благодаря комментарию @ Zabba о SalesforceModel я смог отследить проблему. По сути, это было так:

class ContentAccess < ApplicationRecord

Это должно было быть:

class ContentAccess < SalesforceModel # <-- it was using the wrong table, effectively.

Это была мучительная неделя, но сейчас стало лучше. ?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...