1

У меня есть User моделируютвнешние ключи, указывающие на то же модель

class User < ActiveRecord::Base 
    attr_accessible :email, :name 

    has_many :client_workouts 
end 

и А ClientWorkout моделируют

class ClientWorkout < ActiveRecord::Base 
    attr_accessible :client_id, :trainer_id, :workout_id 

    belongs_to :client, :class_name => User, :foreign_key => 'client_id' 

    belongs_to :trainer, :class_name => User, :foreign_key => 'trainer_id' 
end 

Я сначала хочу знать, что или, если я делаю что-то неправильно при написании ассоциаций , В идеале я хочу иметь возможность вызывать запрос, где я нахожу пользовательские тренировки клиентов, где идентификатор пользователя совпадает с client_id или trainer_id. Так что ...

user.client_workouts.trainer??? 
+0

Это выглядит хорошо для меня. Вы должны просто иметь возможность вызвать 'client_workout.client.email' или' client_workout.trainer.email' из-за ваших отношений 'own_to'. Вы на самом деле пробовали? –

+0

Да, ты прав. Я делал что-то глупое. Благодарю. – jason328

+0

Я обновил свой вопрос. – jason328

ответ

1

Это не будет работать, как рельсы предполагает, что ClientWorkout имеют user_id колонку. Я не думаю, что есть какой-нибудь способ сделать has_many отношение, которое соответствует две колонки ... Вместо того, чтобы вы могли создать метод, как это:

class User < ActiveRecord::Base 
    attr_accessible :email, :name 

    has_many :client_workouts, :foreign_key => "client_id" 

    has_many :trainer_workouts, :foreign_key => "trainer_id" 

    def client_and_trainer_workouts 
    ClientWorkouts.where("client_id = ? OR trainer_id = ?", id, id) 
    end 
end 

В противном случае вы можете создать рамки на модели ClientWorkout, как это:

class ClientWorkout < ActiveRecord::Base 
    attr_accessible :client_id, :trainer_id, :workout_id 

    belongs_to :client, :class_name => User, :foreign_key => 'client_id' 

    belongs_to :trainer, :class_name => User, :foreign_key => 'trainer_id' 

    scope :workouts_for_user, 
     lambda {|user| where("client_id = ? OR trainer_id = ?", user.id, user.id) } 
end 

Вы также можете сделать то же самое, и позволить методу использования использовать область действия на ClientWorkout.

+0

Спасибо. Я надеялся, что будет какой-то трюк, который я пропустил, но, увы, нет. – jason328

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