mbajur
mbajur

Reputation: 4474

Undefined method name for nil when using custom has_many relationship

I'm trying to create the simplest has_many relationship possible for one of my models. It's defined like that:

# i know it doesn't make much sense. I'm using such ridiculous 
# where case to keep things simple for now
has_many :jobs, -> { where(id: 1) }, class_name: SidekiqJob

However, when i' trying to call that relationship in anyway, for example with MyModel.last.jobs, rails throws:

NoMethodError: undefined method `name' for nil:NilClass
from /Volumes/HDD/Users/michal/.rvm/gems/ruby-2.1.1/gems/activerecord-4.0.3/lib/active_record/relation/merger.rb:141:in `block in filter_binds'

Has anyone have any idea on what is going wrong in here?


edit:

Original association definition:

has_many :jobs, (obj) -> { where('jid LIKE ?', "#{obj.superjob_id}%") }, class_name: SidekiqJob

Upvotes: 2

Views: 638

Answers (2)

mbajur
mbajur

Reputation: 4474

It turned out to be related to ruby/active_record versions. According to this thread: create with has_many through association gets NoMethodError (undefined method `name' for nil:NilClass)

What i've done to "fix" that was to change my ruby version to 2.1.10. Then, i got rid of such errors (cause they've been thrown in more places). Anyway, i am still not able to includes my relation defined as in the OP. It seems that it's not possible to includes relations using custom where statements.

Upvotes: 0

SoAwesomeMan
SoAwesomeMan

Reputation: 3396

has_many :jobs, -> { where(id: 1) }, class_name: SidekiqJob

Without digging into the source to see if something like to_s is called on the class_name value, it appears the syntax is incorrect and would require quotation marks around the class name:

has_many :jobs, -> { where(id: 1) }, class_name: "SidekiqJob"

See RailsGuides here: http://guides.rubyonrails.org/association_basics.html#scopes-for-has-many-where

class Author < ApplicationRecord
  has_many :confirmed_books, -> { where "confirmed = 1" },
    class_name: "Book"
end

From 3_2_release_notes.md: https://github.com/rails/rails/blob/37b36842330b5db1996fda80e387eae3a5781db8/guides/source/3_2_release_notes.md

Allow the :class_name option for associations to take a symbol in addition to a string. This is to avoid confusing newbies, and to be consistent with the fact that other options like :foreign_key already allow a symbol or a string.

has_many :clients, :class_name => :Client # Note that the symbol need to be capitalized

Upvotes: 1

Related Questions