2

我有一个重新创建艺术家并将其与用户相关联的工作。用户 has_and_belongs_to_many :artists 和 Artist has_and_belongs_to_many :users。

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

我还看到了 Artists_genres 的创建(Artist 和 Genre 也有互惠的 HABTM 关系)

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

3 回答 3

3

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

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

于 2012-11-20T20:26:47.113 回答
0

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

如果您想用创可贴摆脱它,请将这两个字段重新定义为NULLable(而不是NOT NULL)。

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

确保

config.active_record.record_timestamps = true

如果它是假的,那么时间戳将不会被设置,你会得到你所看到的约束错误。

于 2012-11-19T23:45:07.447 回答
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
于 2012-11-19T23:46:01.177 回答