谷歌搜索,我看到Rails核心团队正在研究Rails 4的解决方案,但这还有一段距离。
Users
和Circles
与另一方的关系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_at
和updated_at
在这里是假的?
答案 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)
在这些日期时间字段中,如果不填充数据,则应插入当前时间戳或将其更改为可空字段。