我正在尝试保存具有外键属性的对象。我不明白为什么它不起作用。外键在数据库中定义为非空。
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 :(得分:0)
首先,如果您向StoreGroup添加has_many :stores
,从长远来看可能更容易,例如,如果您想要检索属于特定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
并将新Store实例另存为其StoreGroup的“子”。请注意,您还需要将代码更改为现有StoreGroup的帐户,以便稍后可以将存储添加到现有StoreGroup。使用带有.first_or_create
子句的.where(...)
对于rails 3.2.x来说是惯用的,尽管在以前版本的Rails中有动态查找器具有创建功能(例如,find_or_create_by_name_and_store_group_id)。
最后,删除validates :store_group
,因为关联验证无法正常工作。如果你真的必须,请使用validates :store_group_id
。
答案 1 :(得分:0)
您正尝试通过store_group
创建/保存store
对象。因此使用:
accepts_nested_attributes_for :store_group
在Store
模型中