26

ActiveRecordテーブルから非ID列で検索したい。コードサンプルを提供するときに、これが明確であることを願っています。

class CoachClass < ActiveRecord::Base
  belongs_to :coach
end

class Coach < ActiveRecord::Base
    has_many :coach_classes, :foreign_key => 'user_name'
end

私がするとき coach_obj.coach_classes、これは正しくトリガーします

SELECT * FROM `coach_classes` WHERE (`coach_classes`.user_name = 2)

(2は私の問題であるそのコーチがidここにいることです。)

トリガーしたい

SELECT * FROM `coach_classes` WHERE (`coach_classes`.user_name = 'David')

(「David」はそのコーチですuser_name

user_nameは一意であり、両方のテーブルに存在します。

なんらかの理由coach_idでテーブルに入れたくありません。coach_classes

4

3 に答える 3

53

アソシエーションの主キーオプションも指定する必要があると思います。

class CoachClass < ActiveRecord::Base 
  belongs_to :coach, :foreign_key => 'user_name', :primary_key => 'user_name'
end

class Coach < ActiveRecord::Base
  has_many :coach_classes, :foreign_key => 'user_name', :primary_key => 'user_name'
end 

これは、関連付けられたオブジェクトの主キーを返すメソッドを指定します(デフォルトはid)。

于 2010-07-23T11:27:56.593 に答える
10

primary_keyデフォルトでに設定されているというオプションがあります:id。使用したい:

has_many :coach_classes, :foreign_key => :user_name, :primary_key => :user_name

また、関連付けでこれらのオプションを使用しますbelongs_to

詳細については、ドキュメントをご覧ください。

于 2010-07-23T11:31:43.057 に答える
-4

あなたは使用する必要がありますfinder_sql

class Coach < ActiveRecord::Base
    has_many :coach_classes, :finder_sql => 'SELECT * FROM `coach_classes` WHERE (`coach_classes`.user_name = "#{user_name}")'
end
于 2010-07-23T11:28:36.500 に答える