Reputation: 4474
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?
Original association definition:
has_many :jobs, (obj) -> { where('jid LIKE ?', "#{obj.superjob_id}%") }, class_name: SidekiqJob
Upvotes: 2
Views: 638
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
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