Если вам не нужно действовать конкретно с данными таблицы likes
, сама модель, вероятно, не нужна. Отношения легки:
class User < ActiveRecord::Base
has_and_belongs_to_many :songs
end
class Song < ActiveRecord::Base
has_and_belongs_to_many :users
end
Это присоединится через несуществующую в настоящее время таблицу song_users. Но так как вы хотите, чтобы он присоединялся через лайки, вы можете поменять каждого на это:
has_and_belongs_to_many :songs, :join_table => 'likes'
Если вы хотите иметь возможность вызывать User.find (1) .likes и получать песни, измените версию пользователя на эту:
class User < ActiveRecord::Base
has_and_belongs_to_many :likes, :join_table => 'likes', :class_name => 'Song'
end
И вы можете изменить версию песни на что-то вроде этого:
class Song < ActiveRecord::Base
has_and_belongs_to_many :liked_by, :join_table => 'likes', :class_name => 'User'
end
Это даст вам Song.find (1) .liked_by.all и пользователей (вы можете оставить их пользователям, если хотите использовать первую версию)
Подробнее о связях habtm можно найти здесь: http://apidock.com/rails/ActiveRecord/Associations/ClassMethods/has_and_belongs_to_many
Изменить, чтобы добавить
Если по какой-либо причине вы хотите действовать в таблице объединения (вам нужны именно методы для объединения), вы можете включить модель следующим образом:
class User < ActiveRecord::Base
has_many :songs, :through => :likes
has_many :likes
end
class Like < ActiveRecord::Base
belongs_to :user
belongs_to :song
end
class Song < ActiveRecord::Base
has_many :users, :through => :likes
has_many :likes
end
Это позволит вам сделать User.find(1).songs.all
, но User.find(1).likes.all
даст вам данные соединения