Search code examples
ruby-on-railsactiverecordhas-manyrelationbelongs-to

Rails through relation with has_many and belongs_to


I need to define relation between Packages and Delivers: 1 deliver can has many packages. But packages can not have delivers. Packages can just belong to Delivers.

Deliver has_many packages, but package can just belongs_to delivers (or to assigments, I do not know).

I should have Assignment table, that store deliver_id and package_id. And when I assign package to deliver - it should create new assignment record

It seems, that I need to use:

through: :package_assignments  

But I do not understand the relation between packages, delivers and assignments.

For now I define package.rb:

class Package < ApplicationRecord
  belongs_to :assignments

deliver.rb:

class Deliver < ApplicationRecord
  has_many :assignments
  has_many :packages, through: :assignments 

assignment.rb:

class Assignment < ApplicationRecord
  belongs_to :deliver
  has_many :packages

Solution

  • In result, I realized many_to_many relation betweeen Package and Deliver through Assignment. It allows to assign, for example, Package to Deliver and it automatically creates Assignment record with package_id and deliver_id.

    Deliver model:

    class Deliver < ApplicationRecord
      has_many :assignments, dependent: :destroy
      has_many :packages, through: :assignments
    end
    

    Package model:

    class Package < ApplicationRecord
      has_many :assignments, dependent: :destroy
      has_many :delivers, through: :assignments
    end
    

    Assignment model:

    class Assignment < ApplicationRecord
      belongs_to :deliver
      belongs_to :package
    end