Just a random thing I learned and wanted to document. I was struggling to save a double nested association coming in from a form, and I kept hitting an error that the record at the bottom of the nesting couldnt be created because its parent hadnt been created.
class Building
has_many :floors
end
class Floor
has_one :copy_machine, foreign_key: :floor_id
end
class CopyMachine
belongs_to :floor
end
Well after some digging I figured out that since I had defined the foreign key, rails is unable to guess the inverse from the class name, so the parent can't be saved. I don't know why I set that foreign key, since I didn't actually need it since the column was named according to the class.
I was able to remove it and the error was gone. But if I had needed it to be set, say the foreign key on CopyMachine was "level_id", then the inverse_of key would need to be passed when defining the has_one relationship. This is apparently the case when defining the foreign_key or the class_name parameters.
The paragraph at the bottom of this article helped me figure this out https://www.viget.com/articles/exploring-the-inverse-of-option-on-rails-model-associations/.
Top comments (0)