Один-к-одному полиморфный - PullRequest
1 голос
/ 28 февраля 2011

У меня есть два типа «владельца», каждый из которых может иметь одно «предпочтение».

Это моя текущая настройка (то есть, как я предполагаю, что будет работать полиморфизм один к одному):

Company.rb
  has_one :pref, :as => :owner

Representative.rb
  has_one :pref, :as => :owner

Pref.rb
  belongs_to :owner, :polymorphic => true

Затем я пытаюсь выполнить следующие команды:

Company.first.owner => nil
Company.first.owner.build => error

Как мне установить эту связь?


Обновление: подробности об ошибке

NoMethodError: undefined method `build' for nil:NilClass
from /Users/san/.rvm/gems/ruby-1.9.2-p0/gems/activesupport-3.0.1/lib/active_support/whiny_nil.rb:48:in `method_missing'
from (irb):10
from /Users/san/.rvm/gems/ruby-1.9.2-p0/gems/railties-3.0.1/lib/rails/commands/console.rb:44:in `start'
from /Users/san/.rvm/gems/ruby-1.9.2-p0/gems/railties-3.0.1/lib/rails/commands/console.rb:8:in `start'
from /Users/san/.rvm/gems/ruby-1.9.2-p0/gems/railties-3.0.1/lib/rails/commands.rb:23:in `<top (required)>'
from script/rails:6:in `require'
from script/rails:6:in `<main>'

Моя миграция:

create_table :prefs do |t|
    t.integer :owner_id, :null => true
    t.string :owner_type, :null => true
    ...
end

Последний вопрос

# after manually building a pref to link to this representative...
Representative.first.pref => finds pref
Representative.last.pref.create => error

NoMethodError: undefined method `new' for "#<Pref:0x00000106a18ce8>":Pref
from /Users/san/.rvm/gems/ruby-1.9.2-p0/gems/activerecord-3.0.1/lib/active_record/associations/association_proxy.rb:212:in `method_missing'

Это так запутанно!


Ответ:

См .: Использование сборки с ассоциацией has_one в rails

Representative.last.build_pref => works

Ответы [ 2 ]

1 голос
/ 28 февраля 2011

Это немного запутанные отношения, но ... я бы предпочел сделать это так:

Вспомните о полях: ownerable_type,: ownerable_id.

Company.rb
  has_one  :owner, :as => :ownerable

Representative.rb
  belongs_to :ownerable, :polymorphic => true

Owner.rb
  belongs_to :ownerable, :polymorphic => true

После этого

Company.first.owner, should work

а также

Owner.first.ownerable

должен вернуть компании

На самом деле, мне кажется, когда у вас есть:

Company.rb
  belongs_to :ownerable, :polymorphic => true

Representative.rb
  has_many :companies, :polymorphic => true, :as => :ownerable

Owner.rb
  has_many :companies, :polymorphic => true, :as => :ownerable

Вы можете переключиться на has_one, конечно.

1 голос
/ 28 февраля 2011

В чем ошибка? Правильно ли вы перенесли свою базу данных? i.e.:

t.string :owner_type
t.integer :owner_id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...