Mysql 如何在rails中设置外键?

Mysql 如何在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

我正在尝试保存具有外键属性的对象。我不明白为什么它不起作用。外键在数据库中定义为NOTNULL

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