Rails — модель Belongs_to, где модель может быть любой моделью, реализующей отношения?

Можно ли реализовать в Rails 3 ассоциацию

class ApiCredentials < ActiveRecord::Base
  belongs_to Model

end

где Model может быть любой моделью.

Затем в таблице api_credentials у меня есть такие поля, как model_id и model, чтобы отслеживать эту ассоциацию.

Я не предполагаю, что удобные стандартные запросы ActiveRecord все еще будут работать, но кто-нибудь реализовал что-то подобное эффективно или использовал другой метод?

В конце концов, все, что я хочу сделать, это все еще проверить, есть ли в конкретной модели ApiCredentials, но я не могу знать заранее, будет ли модель его реализовывать.

Заранее спасибо.


person Damon Aw    schedule 04.03.2012    source источник


Ответы (1)


Похоже, вы говорите о полиморфной ассоциации:

С полиморфными ассоциациями модель может принадлежать более чем одной другой модели в одной ассоциации. Например, у вас может быть модель изображения, принадлежащая либо модели сотрудника, либо модели продукта.
[...]
Полиморфное объявление belongs_to можно рассматривать как настройку интерфейса, который может использовать любая другая модель. использовать.

Это даже использует ваши столбцы model_id/model, но называет их X_id и X_type, где X — имя ассоциации:

class CreatePictures < ActiveRecord::Migration
  def change
    create_table :pictures do |t|
      #...
      t.integer :imageable_id
      t.string  :imageable_type
      #...
    end
  end
end

В вашем случае у вас будет что-то вроде этого:

class ApiCredential < ActiveRecord::Base
  belongs_to :creditable, :polymorphic => true
end

class Pancake < ActiveRecord::Base
  has_many :api_credentials, :as => :creditable
end

class OneCentStamp < ActiveRecord::Base
  has_many :api_credentials, :as => :creditable
end
person mu is too short    schedule 04.03.2012
comment
Спасибо за напоминание о полиморфизме и быстрый ответ. Думаю, это именно то, что мне нужно. Позвольте мне быстро взглянуть на это! - person Damon Aw; 04.03.2012
comment
Это ИМЕННО то, что я искал. Спасибо. Единственная разница, которую я сделал, заключалась в том, что я связал свою модель так, что Pancake has_one ApiCredential. Надеюсь, там нет подводных камней. - person Damon Aw; 04.03.2012
comment
@daemonsy: должно нормально работать с has_one: guides.rubyonrails.org/ (см. 4.2.2.1). - person mu is too short; 04.03.2012