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')

为什么?提前致谢 :)

4

2 回答 2

0

您正在尝试store_group通过store. 因此使用:

accepts_nested_attributes_for :store_group

在你的Store模型中

在此处阅读有关 accept_nested_attributes_for 的信息

于 2013-02-17T05:42:57.693 回答
0

首先,从长远来看,如果您将 a 添加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并保存新的 Store 实例作为其 StoreGroup 的“子”。请注意,您还需要更改代码以考虑现有的 StoreGroups,以便以后可以将商店添加到现有的 StoreGroups。在 Rails 3.2.x 中使用.first_or_createwith.where(...)子句是惯用的,尽管在以前的 Rails 版本中存在具有创建权限的动态查找器(例如,find_or_create_by_name_and_store_group_id)。

最后,删除,validates :store_group因为关联验证不能那样工作。如果你真的必须,使用validates :store_group_id.

于 2013-02-17T05:23:09.700 回答