I am trying to create association between active record objects with custom name.
For example, I have a User table and Post class, and Post class has writer_id and reader_id. I want to create association for both writer_id and reader_id so that I can just call post.writer to get the User object. I have tried multiple options (one of them: Rails belongs_to with custom column name), but it did not solve the problem. Anyone knows how to unblock this issue?
CodePudding user response:
try this
class Post < ApplicationRecord
belongs_to :writer, class_name: 'User'
belongs_to :reader, class_name: 'User'
end
sorry, initially I put class instead of class_name
CodePudding user response:
In this case you should be using belongs_to since the foreign key should be stored on the posts table:
class Post < ApplicationRecord
belongs_to :author,
class_name: 'User'
end
class CreatePosts < ActiveRecord::Migration[7.0]
def change
create_table :posts do |t|
t.references :author,
null: false,
foreign_key: { to_table: :users }
t.timestamps
end
end
end
class User < ApplicationRecord
has_many :posts_as_author,
class_name: 'Post',
foreign_key: :author_id
end
This creates a one to many assocation. Note that the foreign_key option is required in the has_many assocation since its normally derived from the name of the class.
has_one wouldn't work since it means that you would be storing a post_id on the users table. has_one always has a corresponding belongs_to on the other side of the assocation. has_one is basically just has_many with a LIMIT 1 tacked onto the query and generates slighly different methods.
When it comes to readers I can almost guarentee what you actually want is a many to many assocation.
