Mysql 如何在rails中设置外键?
我正在尝试保存具有外键属性的对象。我不明白为什么它不起作用。外键在数据库中定义为NOTNULLMysql 如何在rails中设置外键?,mysql,ruby-on-rails,ruby-on-rails-3,foreign-keys,rails-activerecord,Mysql,Ruby On Rails,Ruby On Rails 3,Foreign Keys,Rails Activerecord,我正在尝试保存具有外键属性的对象。我不明白为什么它不起作用。外键在数据库中定义为NOTNULL class Store < ActiveRecord::Base attr_accessible :latitude, :longitude, :description validates :store_group, :presence => true validates :description, :presence => true, :length => {:m
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
但是,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')
为什么??
提前感谢:)首先,从长远来看,如果您向StoreGroup添加一个
has\u many:stores
,例如,如果您想要检索属于某个特定StoreGroup的所有门店,可能会更容易。其次,您应该通过它的StoreGroup添加store,因为您已经在那里建立了关联,所以这相当简单(请注意对store.create
)的更改):
group=StoreGroup.create(名称:“name”,描述:“description”,图像:“image”)
group.stores您正试图通过store
创建/保存store\u group
对象。因此,使用:
accepts_nested_attributes_for :store_group
在您的商店中
型号
我也尝试了Store.new(:Store\u group=>group.id…),但没有成功。嗨,Rahul,我尝试过,但当我实例化Store项目时,它会引发ActiveModel::MassaSignmentSecurity::错误:无法批量分配受保护的属性:Store\u group。因此,我在attr_accessbile中添加了store_组,但是,前面的MySQL异常仍然在引发。请参考此内容,您需要将您的关联attr添加到attr_accessorsI,我使用以下方法解决:ok。。。但是这里的存储组和存储将在不同的事务下创建,因此,如果在创建store
时出现任何验证错误,您的storeGroup
仍将提交到数据库。嗨,Eric,首先感谢您提供的提示。我在StoreGroup中添加了许多,并替换了store\u group\u id的验证。因此,我尝试了您所说的,但在执行此命令之后“group.stores抱歉,在我的示例中,我使用了StoreGroup.new
where.new不会保存实例,因此在为实例分配存储时没有可用的ID。它应该是StoreGroup.create
。为此,我编辑了我的示例。
group = StoreGroup.create(name: "name", description: "description", image: "image")
group.stores << Store.create(lat: 1, long: 1, desc: "description")
accepts_nested_attributes_for :store_group