0

Я выполнил ответ, указанный ниже по ссылке, чтобы настроить отношения many_to_many в моем приложении Rails 4. (Новое для рельсов, здесь.) Implement "Add to favorites" in Rails 3 & 4Rails 4 has_many: через связь с: source

У меня есть пользователи и упражнения, и я хочу, чтобы пользователи могли иметь любимые упражнения. Я создал таблицу соединений с именем FavoriteExercise с user_id и exercise_id как столбцы. У меня это заселение, и, похоже, он работает нормально, но я не могу использовать его для прямого звонка в избранное.

Значение, я хочу, чтобы напечатать:
user.favorite = #list упражнений, которые были Избраного

Я получаю эту ошибку, когда я пытаюсь загрузить этот список в моем браузере:

SQLite3::SQLException: no such column: exercises.favorite_exercise_id: 

SELECT "exercises".* FROM "exercises" INNER JOIN "favorite_exercises" 
ON "exercises"."favorite_exercise_id" = "favorite_exercises"."id" 
WHERE > "favorite_exercises"."user_id" = ? 

Мои модели:

class User < ActiveRecord::Base 
    has_many :workouts  
    has_many :exercises 
    has_many :favorite_exercises 
    has_many :favorites, through: :favorite_exercises, source: :exercises 

class Exercise < ActiveRecord::Base 
    belongs_to :user 
    has_many :workouts, :through => :exercises_workouts 
    has_many :favorites 
    has_many :favorited_by, through: :favorite_exercises, source: :exercises 

class FavoriteExercise < ActiveRecord::Base 
    has_many :exercises 
    has_many :users 

Я просто попытался переключения FavoriteExercise в «Белу ngs_to 'вместо' has_many, потому что, похоже, это путь, который должен идти? но потом я получаю эту ошибку:

uninitialized constant User::Exercises 

Просто пытаюсь выяснить, как настроить таблицы и ассоциаций, так что я могу назвать .favorites на пользователя и получить все свои любимые.

ответ

0

Вам просто нужно, чтобы упростить вашу логику модели следующим образом:

class User < ActiveRecord::Base 
    has_many :workouts 
    has_many :exercises  
    has_many :favorite_exercises 
    has_many :favorites, through: :favorite_exercises, class_name: "Exercise" 

class Exercise < ActiveRecord::Base 
    belongs_to :user 
    has_many :workouts, :through => :exercises_workouts 
    has_many :favorite_exercises 
    has_many :favorited_by, through: :favorite_exercises, class_name: "User" 

class FavoriteExercise < ActiveRecord::Base 
    belongs_to :favorited_by 
    belongs_to :favorite 

Тогда вы можете позвонить user.excercises или excercise.users в вашем пользователя, например/Excercise.

user.excercises = #list упражнений, которые были добавлены в избранное

ли, что многие-ко-многим вы хотите?

+0

Ну, я надеялся, чтобы иметь возможность иметь оба следующие: '' 'user.exercises = # все упражнения, созданные пользователем''', и ' '' user.favorites = # все упражнения, назначенные пользователем''' , поэтому я имел '' 'has_many: exercise''' отдельно от' '' has_many: favorites' '' – Riley

+0

Я изменил код в соответствии с тем, что вы ввели. '' 'Users.exercises''' возвращает упражнения, которые имеют user_id, связанный с моим пользователем, а не с упражнениями из таблицы FavoriteExercises, которые связаны с моим user_id – Riley

+0

, и я по-прежнему получаю ту же ошибку SQL от пользователя '' '.избранное''' – Riley

0

Если вам нужен список упражнений пользователя и в то же самое, список любимых упражнений пользователя, то я думаю, что ваша таблица соединений должна быть просто user_exercises, в которой она будет перечислять все упражнения пользователей. Чтобы перечислить любимые упражнения, просто добавьте логическое поле, указывающее, является ли упражнение фаворитом пользователя и добавьте область: scope, чтобы получить все любимые упражнения.

Так что в вашей миграции файл:

users_exercises должен иметь user_id, exercise_id, is_favorite

Тогда в модели:

class User < ActiveRecord::Base 
    has_many :workouts  
    has_many :users_exercises 
    has_many :exercises, through: :users_exercises 

    scope :favorite_exercises, -> { 
    joins(:users_exercises). 
    where("users_exercises.is_favorite = ?", true) 
    } 

class Exercise < ActiveRecord::Base 
    has_many :workouts, :through => :exercises_workouts 
    has_many :users_exercises 
    has_many :users, through: :users_exercises 

class UsersExercise < ActiveRecord::Base 
    belongs_to :exercise 
    belongs_to :user 
+0

Это позволяет пользователям использовать любимые упражнения, отличные от своих? (Я раньше не использовал область, поэтому я читаю документы.) – Riley

+0

Нет, это не позволит любимым упражнениям, отличным от их собственных. Но если вы хотите, чтобы это произошло, то, возможно, просто добавьте другую таблицу join users_favorite_exercises в сторону для users_exercises. :) –

Смежные вопросы