Rails: внешний идентификатор без идентификатора ActiveRecord - PullRequest
24 голосов
/ 23 июля 2010

Я хочу ActiveRecord для поиска по столбцу без идентификатора из таблицы. Надеюсь, это понятно, когда я дам вам мой пример кода.

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')

(«Давид» - это тот самый тренер user_name)

user_name уникален и присутствует в обеих таблицах.

Я по какой-то причине не хочу иметь coach_id в моей таблице coach_classes

Ответы [ 3 ]

52 голосов
/ 23 июля 2010

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

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).

9 голосов
/ 23 июля 2010

Существует опция с именем primary_key, которая по умолчанию установлена ​​на :id.Вы хотите использовать:

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

Также используйте эти опции для ассоциации belongs_to.

Подробнее в документации .

0 голосов
/ 23 июля 2010

Вам нужно использовать finder_sql:

class Coach < ActiveRecord::Base
    has_many :coach_classes, :finder_sql => 'SELECT * FROM `coach_classes` WHERE (`coach_classes`.user_name = "#{user_name}")'
end
...