NoMethodError для has_many: Хотя (неопределенный метод имя_класса для nil: NilClass) - PullRequest
1 голос
/ 26 сентября 2019

Я недавно столкнулся с NoMethodError , когда я вызываю любой метод на organization.subscriptions

NoMethodError at /organizations/1
undefined method `class_name' for nil:NilClass
Did you mean?  class_eval

Похоже, имя_класса вызывается для чего-то, что не существует.Но поскольку есть соглашение и подписка, этого не должно произойти.Я смотрю на свой код, но не вижу ошибки.Кто-нибудь может помочь?

# organization.rb
class Organization < ApplicationRecord
  has_many :deals
  has_many :subscriptions, through: :deals, source: :initialized_subscriptions
end

# deal.rb
class Deal < ApplicationRecord
  belongs_to :organization
  has_many :initialized_subscriptions, foreign_key: :initial_deal_id, class_name: 'Subscription'
end

# subscription.rb
class Subscription < ApplicationRecord
  belongs_to :initial_deal, class_name: 'Deal'
end

Вот таблицы

organizations    
+----+----------+
| id |   name   |
+----+----------+
|  1 | Org name |
+----+----------+

deals
+----+------------+-----------------+
| id |    name    | organization_id |
+----+------------+-----------------+
|  1 | First Deal |               1 |
+----+------------+-----------------+

subscriptions
+----+-----------------+
| id | initial_deal_id |
+----+-----------------+
|  1 |               1 |
+----+-----------------+

Большое спасибо за помощь, ребята!

1 Ответ

1 голос
/ 26 сентября 2019

Это слепой выстрел, но я думаю, что Rails предполагает другое имя класса в вашей has_many ассоциации.

# In this case, Rails assumes class_name: 'Subscription'
has_many :subscriptions
# In this case, Rails also assumes class_name: 'Subscription'
has_many :subscriptions, through: :deals
# But in this case, I think Rails assumes class_name: 'InitializedSubscription'
has_many :subscriptions, through: :deals, source: :initialized_subscriptions

Возможно попробуйте это

has_many :subscriptions, through: :deals,
                         source: :initialized_subscriptions,
                         class_name: 'Subscription'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...