Mark Hustad
Mark Hustad

Reputation: 169

Trouble changing to has_many through from has_many and belongs_to

I've done about a billion searches and tried a number of things here but I'm still getting errors. I've recently changed to a has many through via a model called joinable(maybe thats the problem) and I can't seem to get things working straight. Part of me thinks it something small as I get the idea of it all but I'm not sure I've done it correctly. I'm also using devise.

Here is what I think are all the relevant portions

User

class User < ActiveRecord::Base
  acts_as_voter
  has_many :joinables
  has_many :pits, through: :joinables
  has_many :comments
  enum role: [:user, :vip, :admin]
  after_initialize :set_default_role, :if => :new_record?


class Pit < ActiveRecord::Base
  validates :topic, :author, :summary, presence: true
  acts_as_taggable
  acts_as_votable
  has_many :comments
  has_many :joinables
  has_many :users, through: :joinables
  mount_uploader :image, ImageUploader

I created a separate table called "joinable" and now I'm stuck figuring out how to populate it. I can create a user, but can't create a pit. Do I need to revamp my controllers or is their something small I may be missing? I get the idea but some of the little details are fuzzy based on all that I've read so far. I even tried a HABTM with a join table called Pit_Users.

I'm currently getting "Could not find table 'joinables"

coming from here in my controller

def create
@pit = current_user.pits.create(pit_params) 

recent migration

class Joinable < ActiveRecord::Migration
  create_table :joinable do |t|
      t.integer :pit_id, :user_id
      t.timestamps
    end
end

I've tried a number of combinations all with similar errors. Many of the tutorials/guides are good with the basics but then seem to be leaving out a few details. That or I'm just missing them. Anyways. Would love it if someone more knowledgeable could point out what are probably obvious mistakes. Thanks.

Upvotes: 0

Views: 107

Answers (2)

roob
roob

Reputation: 1136

In the migration file, it should be:

class Joinables < ActiveRecord::Migration
  create_table :joinables do |t|
    t.integer :pit_id  
    t.integer :user_id
  end
end    

And in the app/models/joinable.rb, there should be:

class Joinable < ActiveRecord::Base
  belongs_to :user
  belongs_to :pit
end

You can verify if it is working at the Rails console. Try this to get a Pit record with the association:

user_1 = User.create( ... )
pit_1  = user_1.pits.create!( ... )
pit_1.users.first  # should give you user as user_1

Upvotes: 1

Nermin
Nermin

Reputation: 6100

Solution is to run rails generator for model

Run from console

rails generate model Joinable pit:references user:references

And delete your migration file for

class Joinable < ActiveRecord::Migration
  create_table :joinable do |t|
      t.integer :pit_id, :user_id
      t.timestamps
    end
end

After running rails generator you will get model named Joinable that is required for relations when using through and it will create appropriate migration for you.

Upvotes: 1

Related Questions