无法创建记录,因为连接表需要created_at(HABTM + Rails)

时间:2012-10-26 06:32:39

标签: ruby-on-rails sqlite migration schema has-and-belongs-to-many

谷歌搜索,我看到Rails核心团队正在研究Rails 4的解决方案,但这还有一段距离。

UsersCircles与另一方的关系has_and_belongs_to_many

我的架构如下所示:

  create_table "circles", :force => true do |t|
    t.string   "name"
    t.datetime "created_at", :null => false
    t.datetime "updated_at", :null => false
  end

  create_table "circles_users", :force => true do |t|
    t.integer  "circle_id"
    t.integer  "user_id"
    t.datetime "created_at", :null => false
    t.datetime "updated_at", :null => false
  end

  create_table "users", :force => true do |t|
    t.string   "name"
    t.string   "email"
    t.datetime "created_at", :null => false
    t.datetime "updated_at", :null => false
    t.string   "password"
  end

但在我的代码中,当我尝试执行此操作时,在circles_controller中:

  def create
    @circle = Circle.new(params[:circle])
    @circle.users << User.find(session[:user].id)
...

我的浏览器出现以下错误:

SQLite3::ConstraintException: circles_users.created_at may not be NULL: INSERT INTO "circles_users" ("circle_id", "user_id") VALUES (11, 5)

我应该怎样处理created_atupdated_at在这里是假的?

4 个答案:

答案 0 :(得分:1)

我最终通过从用于创建连接表的迁移中删除时间戳来使其工作。

正确的架构应该是这样的:

create_table "circles_users", :force => true do |t|
t.integer  "circle_id"
t.integer  "user_id"
  end

答案 1 :(得分:0)

试试这个

def new
 @circle = Circle.new
 1.times { @circle.users.build } if @circle.users.nil?
end

def create
  @circle = Circle.new(params[:circle])
  @circle.update_attributes(session[:user]) # this will automatically update location table by using relationship
  @circle.save   
end

请参阅HABTM

答案 2 :(得分:0)

试一试

def create
  @circle = Circle.new(params[:circle])
  @circle.users = [User.find(session[:user].id)]

可能不起作用,我没有在当地试过,sry abt ^ _ ^

答案 3 :(得分:-1)

在这些日期时间字段中,如果不填充数据,则应插入当前时间戳或将其更改为可空字段。