У меня есть модель продавца и пользователя, которые определяют как взаимно-однозначную связь.Невозможно назначить ассоциированный объект в ассоциации один к одному 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">
У меня нет миграций, так как я изменяю модель на базе MySQL и выгружаю ее в schema.rb. У меня есть «merchant_id» в модели Merchant. Поскольку это взаимно-однозначная ассоциация, я просто включаю 'user_id' в модель Merchant.Требуется ли рельсы для определения «merchant_id» в модели пользователя? – jctank
В этом случае ваши отношения неправильны. Это сторона, которая имеет 'принадлежит_то', для которого требуется внешний ключ. Примечание. Соглашение Rails заключается в том, что собственный первичный ключ модели находится в столбце с именем 'id', а внешние ключи - в форме' _id'. Вы можете это изменить, конечно ... если вам нравится боль. –
jimworm