I'm using ActiveRecord 2.3.2. I have a class with a belongs_to association like this:
class Foo < ActiveRecord::Base belongs_to :bar end
It is valid for bar to be nil (thus, in the database, foos.bar_id can be null). However, if I execute the following I get an error:
foo = Foo.new foo.bar # => nil foo.save! foo.bar # expect nil but get error
The full error message is, "ActiveRecord::RecordNotFound (Couldn't find Bar without an ID)". Tracing the code I see that ActiveRecord::Base.find_from_ids(ids, options) is being called by passing an array containing a single, nil, element for the ids argument. Here is the method:
def find_from_ids(ids, options) expects_array = ids.first.kind_of?(Array) return ids.first if expects_array && ids.first.empty?
ids = ids.flatten.compact.uniq
case ids.size when 0 raise RecordNotFound, "Couldn't find #{name} without an ID" when 1 result = find_one(ids.first, options) expects_array ? [ result ] : result else find_some(ids, options) end end
Without delving further to assess other consequences, it seems to me that either nil should be returned when ids.size == 0 or the line "ids = ids.flatten.compact.uniq" should be replaced with:
ids = ids.flatten.uniq return nil if ids.length == 1 && ids.first.nil? ids.compact!
Any thoughts gratefully received!
Thanks,
Chris.