Question

I'd like to be able to reference a model (a has_many relationship) more than once in the same model. For example, given the following models:

class MyModel
    include Mongoid::Document

    field :name, type: String
    has_many :main_efforts, :class_name => 'Effort', as: :effortable, dependent: :delete, autosave: true
    has_many :secondary_efforts, :class_name => 'Effort', as: :effortable, dependent: :delete, autosave: true

    validates_presence_of :name
end

class Effort
    include Mongoid::Document

    field :name, type: String
    belongs_to :effortable, polymorphic: true
    validates_presence_of :name
end

As you can see, the Effort model is referenced twice. Originally, my Effort model wasn't polymorphic, but it seemed Mongoid was unable to determine which collection (main_efforts or secondary_efforts) the effort belonged to. As such, I made it polymorphic. After making it polymorphic, however, my main_efforts and secondary_efforts fields are always an empty array.

What is the proper way to reference a polymorphic model more than once in the same model (assuming a polymorphic model is necessary)?

Was it helpful?

Solution

Figured it out:

class MyModel
    include Mongoid::Document

    field :name, type: String
    has_many :main_efforts, :class_name => 'Effort', dependent: :delete, autosave: true, :inverse_of => :main_effort
    has_many :secondary_efforts, :class_name => 'Effort', dependent: :delete, autosave: true, :inverse_of => :secondary_effort

    validates_presence_of :name
end

class Effort
    include Mongoid::Document

    field :name, type: String
    belongs_to :main_effort, :class_name => 'Conop', :inverse_of => :main_efforts
    belongs_to :secondary_effort, :class_name => 'Conop', :inverse_of => :secondary_efforts
    validates_presence_of :name
end
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top