3

名前空間にサービスとインストラクターの 2 つのモデルがあり、どちらも has_and_belongs_to_many で定義された、互いに多対多の関係にあります。

class Scheduling::Service < ActiveRecord::Base

  has_and_belongs_to_many :instructors
end

class Scheduling::Instructor < ActiveRecord::Base
  attr_accessible :first_name, :last_name
  has_many :instructor_availabilities

  scope :of_service, lambda { |service_id| joins(:services).where(:services => {:id => service_id})}

  has_and_belongs_to_many :services, :class_name => "Scheduling::Service"
end

of_service のスコープで、of_service がサービスに関連付けられているすべてのインストラクターを返すようにします。

ただし、このスコープを実行すると、次のエラーが発生します。

ActiveRecord::StatementInvalid: PG::Error: エラー: テーブル "services" の FROM 句エントリがありません LINE 1: ...."id" = "instructors_services"."service_id" WHERE "services"... ^ : SELECT "scheduling_instructors".* FROM "scheduling_instructors" INNER JOIN "instructors_services" ON "instructors_services"."instructor_id" = "scheduling_instructors"."id" INNER JOIN "scheduling_services" ON "scheduling_services"."id" = "instructors_services"."service_id " WHERE "services"."id" = 107 LIMIT 1

間違っていると思われるのは、instructors_services というテーブル (そのテーブルは存在しません) に参加し、関連するモデルの名前空間を無視していることです。名前空間と一致する Scheduling_instructors_services というテーブルに参加する必要があります。

4

1 に答える 1

4

:join_table => 'scheduling_instructors_services'次のようにリレーションに追加してみてください。

has_and_belongs_to_many :instructors, :class_name => "Scheduling::Instructor", :join_table => 'scheduling_instructors_services'
has_and_belongs_to_many :services, :class_name => "Scheduling:: Service", :join_table => 'scheduling_instructors_services'

また、そうすべきではありませんか

.where('instructors_services.id' => service_id)

それ以外の

.where(:services => {:id => service_id})

于 2013-05-08T14:08:06.347 に答える