2013-11-13 3 views
0

У меня есть модель продавца и пользователя, которые определяют как взаимно-однозначную связь.Невозможно назначить ассоциированный объект в ассоциации один к одному Rails

Merchant модель

class Merchant < ActiveRecord::Base 
    has_one :user, dependent: :destroy 

модель пользователя

class User < ActiveRecord::Base 
    validates :username, uniqueness:{case_sensitive: false} 
    belongs_to :gender 
    belongs_to :merchant, dependent: :restrict_with_exception 

Пол модель

class Gender < ActiveRecord::Base 
    has_many: users 

У меня нет проблемы при создании пользователя OBJ и сохранить его в БД. Также нет проблем с назначением пол obj g Пользователю obj u.

g = Gender.create(gender: "M") 
u = User.create(username: "tester", first_name: "Tester", last_name: "Mac", email:"[email protected]", passwd:"passwddfaff ", salt: "fdafeagda", active: true, gender:g) 

Проблема: не может присвоить существующему пользователю u в торговом OBJ m

m = Merchant.create(user: u, company: "company") 

возвращает

DEPRECATION WARNING: You're trying to create an attribute `merchant_id'. 
Writing arbitrary attributes on a model is deprecated. Please just use `attr_writer` etc. (called from irb_binding at (irb):17) 

D, [2013-11-12T15:11:45.838908 #834] DEBUG -- : (0.1ms) COMMIT 
D, [2013-11-12T15:11:45.839365 #834] DEBUG -- : (0.1ms) BEGIN 
D, [2013-11-12T15:11:45.842261 #834] DEBUG -- : SQL (0.4ms) INSERT INTO `merchants`  (`company`, `created_at`, `updated_at`) VALUES ('company', '2013-11-12 23:11:45', '2013-11-12 23:11:45') 
E, [2013-11-12T16:58:22.311452 #1032] ERROR -- : Mysql2::Error: Field 'user_id' doesn't have a default value: INSERT INTO `merchants` (`company`, `created_at`, `updated_at`) VALUES ('mystorebag', '2013-11-13 00:58:22', '2013-11-13 00:58:22') 

Я также попробовать использовать Merchant.new

m = Merchant.new 
m.user = u 
m.company = "com" 
m.save 

У меня такая же ошибка sql, как указано выше, однако, когда я пытаюсь выполнить m.user, он выводит пользователя obj; с m, он выводит атрибут user как ноль

Как указан в методе has_one в API рейл

association=(associate) Assigns the associate object, extracts the primary key, 
sets it as the foreign key, and saves the associate object. 

В моем случае, присваивающее OBJ пользователя не кажется, имеет первичный ключ извлеченные и наборы это как внешний ключ.

Может ли кто-нибудь указать мне на проблему? Что я пропустил? Благодаря!

Редактировать Вот отражение Купеческого Пользователя

Merchant.reflections[:user] 

=> #<ActiveRecord::Reflection::AssociationReflection:0x007f816a8b41e0 
@macro=:has_one, @name=:user, @scope=nil, @options={:dependent=>:destroy}, 
@active_record=Merchant(id: integer, user_id: integer, company: string, 
created_at:datetime, updated_at: datetime), @plural_name="users", @collection=false, 
@class_name="User", @klass=User(id: integer, gender_id: integer, username: string, 
first_name: string, last_name: string, email: string, passwd: string, salt: binary, 
active: boolean, created_at: datetime, updated_at: datetime), 
@foreign_key="merchant_id", @active_record_primary_key="id"> 

ответ

0

belongs_to ассоциации требует атрибута <model>_id. В модели User нет атрибута merchant_id.

  1. Вы используете rake db:migrate?
  2. Есть ли миграция, которая добавляет merchant_id в таблицу users, например t.integer :merchant_id или t.references :merchant или add_column :users, :merchant_id, :integer?
+0

У меня нет миграций, так как я изменяю модель на базе MySQL и выгружаю ее в schema.rb. У меня есть «merchant_id» в модели Merchant. Поскольку это взаимно-однозначная ассоциация, я просто включаю 'user_id' в модель Merchant.Требуется ли рельсы для определения «merchant_id» в модели пользователя? – jctank

+0

В этом случае ваши отношения неправильны. Это сторона, которая имеет 'принадлежит_то', для которого требуется внешний ключ. Примечание. Соглашение Rails заключается в том, что собственный первичный ключ модели находится в столбце с именем 'id', а внешние ключи - в форме' _id'. Вы можете это изменить, конечно ... если вам нравится боль. – jimworm

0

Какая глупая ошибка! Я помещаю has_one и принадлежит _ в неправильном файле. Я получил его, изменив has_one на belongs_to и наоборот. ;)

Смежные вопросы