SQLite3 :: ConstraintException:xxxxx.created_at可能不是NULL

时间:2012-11-19 23:32:10

标签: ruby-on-rails activerecord has-and-belongs-to-many

我有一个resque工作,创建一个艺术家并将其与用户关联。用户has_and_belongs_to_many:艺术家,艺术家has_and_belongs_to_many:用户。

def self.perform(itunes_id, user_id=nil)
  artist = Artist.find_by_itunes_id(itunes_id) || lookup_and_create_artist(itunes_id)
  if user_id && user = User.find(user_id)
    user.artists << artist
    user.save!
  end
end

user.artists << artist引发了这个例外:

ActiveRecord::StatementInvalid: SQLite3::ConstraintException: artists_users.created_at may not be NULL: INSERT INTO "artists_users" ("artist_id", "user_id")

我也看过艺术家的创作(艺术家和类型也有互惠的HABTM关系)

ActiveRecord::StatementInvalid: SQLite3::ConstraintException: artists_genres.created_at may not be NULL: INSERT INTO "artists_genres" ("artist_id", "genre_id")

3 个答案:

答案 0 :(得分:3)

事实证明这在Rails中是有目的的,但在许多问题上已经提出:

HABTM关系不会自动设置时间戳,因此我可以删除它们或使用has_many :artists, :through => :artists_genres关系

答案 1 :(得分:0)

听起来您的时间戳设置不正确。

如果您希望以自己的方式进行创作,请将这两个字段重新定义为NULL能够(而不是NOT NULL)。

当应用程序配置错误时,通常会出现问题。

确保

config.active_record.record_timestamps = true

如果为false,则不会设置时间戳,您将看到您所看到的约束错误。

答案 2 :(得分:0)

听起来您的迁移未正确设置时间戳字段。这应该是它的样子:

create_table :artists_users, :id => false do |t|
  t.references :artist
  t.references :user
  t.timestamps
end

create_table :artists_genres, :id => false do |t|
  t.references :artist
  t.references :genre
  t.timestamps
end