dynamoid icon indicating copy to clipboard operation
dynamoid copied to clipboard

Support relationships between classes with a common module parent

Open joshmenden opened this issue 3 years ago • 1 comments

I came about this problem because I am using Dynamoid in a Rails Engine, and I discovered issues where the relationships between models were not functioning correctly due to the isolate_namespace functionality of engines.

For example, piggybacking off the example in the README, if I had classes like this, but in an engine named MyEngine...

module MyEngine
  class User
    include Dynamoid::Document
  
    # ...
  
    has_many :addresses
  end
end

module MyEngine
  class Address
    include Dynamoid::Document
  
    # ...
  
    belongs_to :user # Automatically links up with the user model
  end
end

I would get the following in a rails console

> u = MyEngine::User.create! 
> address = MyEngine::Address.create(user: u)
> u.addresses.count # gives 0

In other words, the MyEngine::Address ID would not be saved on the MyEngine::User dynamo record.

This is because in this line of code in belongs_to.rb, the MyEngine::Address class would evaluate to :"my_engine/addresses" which of course is incorrect.

My solution is to check if both the target_class and the source_class share the same module_parent, check that that module parent custom to the app, and then use the demodulize functionality to strip the class down to its bare name.

joshmenden avatar Aug 08 '22 03:08 joshmenden

Could you plz add specs for the fixed behaviour?

andrykonchin avatar Aug 08 '22 10:08 andrykonchin