Ruby on Rails: ассоциации, когда пользователю нравится песня - PullRequest
0 голосов
/ 17 марта 2011

Я пытаюсь найти наилучший способ настройки базы данных и моделей для следующего сценария.

Пользователю может понравиться бесконечное количество песен.Песня может понравиться бесконечному количеству пользователей один раз.

У меня есть эти таблицы: песни, пользователи, лайки и т. Д. Следуя соглашениям RoR.ключи: user_id, song_id.А также поле с именем 'time' для сохранения метки времени, когда песня понравилась.

Я не уверен, как это сделать, я хотел бы иметь возможность использовать такой код в моих контроллерах:

User.find (1) .likes.all Это не должно возвращаться из таблицы лайков, но должно присоединиться к таблице песен и вывести все песни, которые понравились пользователю.

Какие лучшепрактики для достижения этого в Ruby on Rails в соответствии с их соглашениями?

1 Ответ

3 голосов
/ 17 марта 2011

Если вам не нужно действовать конкретно с данными таблицы 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 даст вам данные соединения

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...