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理想的には、ユーザーの ID がorと一致するユーザーのクライアント ワークアウトを検索するクエリを呼び出せるようにしたいと考えていますtrainer_id。そう...

user.client_workouts.trainer???
4

1 に答える 1

1

Rails は ClientWorkout にuser_id列があると想定しているため、これは機能しません。2 つの列に一致する 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

両方を実行して、use のメソッドが ClientWorkout のスコープを呼び出すようにすることもできます。

于 2013-05-09T20:35:04.553 に答える