0

Я пытаюсь сохранить объект с атрибутом внешнего ключа. Я не понимаю, почему он не работает. Внешний ключ определяется как недействительный в базе данных.Как установить внешний ключ в рельсах?

class Store < ActiveRecord::Base 
    attr_accessible :latitude, :longitude, :description 
    validates :store_group, :presence => true 
    validates :description, :presence => true, :length => {:maximum => 500} 
    validates :latitude, :presence => true 
    validates :longitude, :presence => true 

    belongs_to :store_group 
end 

class StoreGroup < ActiveRecord::Base 
    attr_accessible :name, :description, :image 
    validates :name, :presence => { :message => "Store group can not be empty" } 
end 

Итак, я пытаюсь сохранить магазин:

group = StoreGroup.new(:name=>"name",:description=>"description",:image=>"image") 
store = Store.new(:store_group=>group,:latitude=>1,:longitude=>1,:description=>"description") 
store.save 

Однако MySQL вызывает исключение:

Mysql2::Error: Column 'store_group' cannot be null: INSERT INTO `stores` (`created_at`, `store_group`, `description`, `latitude`, `longitude`, `updated_at`) VALUES ('2013-02-17 04:09:15', NULL, 'description', 1.0, 1.0, '2013-02-17 04:09:15') 

Почему? Заранее благодарен

+0

Я попытался Store.new (: store_group => group.id ...) тоже, но ничего не вышло. – hugalves

ответ

0

Прежде всего, может быть проще в долгосрочной перспективе добавить has_many :stores в StoreGroup, например, если вы когда-либо захотите получить все магазины, принадлежащие определенной группе StoreGroup. Во-вторых, вы должны добавить в магазин через свой StoreGroup, и так как у вас уже есть связь там это довольно просто (обратите внимание на изменение Store.create):

group = StoreGroup.create(name: "name", description: "description", image: "image") 
group.stores << Store.create(lat: 1, long: 1, desc: "description") 

Этот метод будет автоматически установлен :store_group_id и сохранить новый экземпляр магазина как «ребенок» его StoreGroup. Обратите внимание, что вы также захотите изменить свой код на учетную запись для существующих StoreGroups, чтобы впоследствии добавлять магазины в существующие StoreGroups. Использование .first_or_create с предложением .where(...) является идиоматичным для рельсов 3.2.x, хотя в предыдущих версиях Rails существуют динамические искатели с полномочиями создания (find_or_create_by_name_and_store_group_id).

И наконец, удалите validates :store_group, потому что проверки ассоциации не работают таким образом. Если вам действительно нужно, используйте validates :store_group_id.

+0

Привет Эрик, во-первых, спасибо за советы. Я добавил has_many в StoreGroup и заменил валидаты для store_group_id. Итак, я попробовал то, что вы сказали, но после этой команды '' group.stores << Store.create (lat: 1, long: 1, desc: "description") "' он создал то же исключение. Одна вещь, которую я должен ошибаться, столбец в таблице Store для объекта StoreGroup должен быть store_group или store_group_id? Я использую store_group, я не знаю, может ли это быть проблемой для отношений ActiveRecord .. – hugalves

+0

Извините, в моем примере я использовал 'StoreGroup.new', где .new не собирается сохранять экземпляр, и поэтому нет идентификатора будут доступны, когда ему назначено хранилище. Это должно быть 'StoreGroup.create'. Я отредактировал свой пример, чтобы сделать это. – Eric

+0

Нет проблем, спасибо за ответ;) – hugalves

0

Вы пытаетесь создать/сохранить объект store_group через store. Таким образом, использование:

accepts_nested_attributes_for :store_group 

в вашей Store модели

Read here about accepts_nested_attributes_for

+0

Привет, Рахул, я пытался, но когда я создаю экземпляр хранилища, он вызывает ActiveModel :: MassAssignmentSecurity :: Ошибка: не может назначить защищенные атрибуты: store_group. Итак, я добавил store_group в attr_accessbile, однако предыдущее исключение MySQL все еще поднимается. – hugalves

+0

Обратитесь к http://stackoverflow.com/a/8321540/985051 Вам необходимо добавить свою ассоциацию attrs к attr_accessors –

+0

Я решил использовать это: http://stackoverflow.com/questions/4912154/how-to-save Связанные-модели-с-non-null-foreign-key – hugalves

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