我有一个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")
答案 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