【问题标题】:accept_nested_attributes_for in a many-to-many relationshipaccept_nested_attributes_for 在多对多关系中
【发布时间】:2012-11-08 10:43:11
【问题描述】:

我试图为此找到解决方案,但大多数文献都涉及如何创建表单,而不是如何将内容保存在数据库中。我遇到的问题是accepts_nested_attributes_for 在保存对现有数据库实体的修改时似乎工作正常,但在尝试创建新对象树时失败。

一些背景。我的课程如下:

class UserGroup < ActiveRecord::Base
    has_many :permissions
    has_many :users

    accepts_nested_attributes_for :users
    accepts_nested_attributes_for :permissions
end

class User < ActiveRecord::Base
    has_many :user_permissions
    has_many :permissions, :through => :user_permissions

    belongs_to :user_group

    accepts_nested_attributes_for :user_permissions
end

class Permission < ActiveRecord::Base
    has_many :user_permissions
    has_many :users, :through => :user_permissions

    belongs_to :user_group
end

class UserPermission < ActiveRecord::Base
    belongs_to :user
    belongs_to :permission

    validates_associated :user
    validates_associated :permission

    validates_numericality_of :threshold_value
    validates_presence_of :threshold_value

    default_scope order("permission_id ASC")
end

权限看起来很奇怪,但是每个用户都有一个不同的阈值,这就是为什么需要这样。

无论如何,正如我所说,当我PUT 更新,例如阈值时,一切正常。这是控制器代码(UserGroupController,我发布的是整个用户组,而不是一次发布一个用户):

def update
    @ug = UserGroup.find(params[:id])
    @ug.update_attributes!(params[:user_group])
    respond_with @ug
end

输入的典型数据是:

{"user_group":
    {"id":3,
    "permissions":[
        {"id":14,"name":"Perm1"},
        {"id":15,"name":"Perm2"}],
    "users":[
        {"id":7,"name":"Tallmaris",
         "user_permissions":[
             {"id":1,"permission_id":14,"threshold_value":"0.1"},       
             {"id":2,"permission_id":15,"threshold_value":0.3}]
        },
        {"name":"New User",
         "user_permissions":[
             {"permission_id":14,"threshold_value":0.4},
             {"permission_id":15,"threshold_value":0.2}]
        }]
    }
}

如您所见,“新用户”没有 ID,他的权限记录也没有 ID,因为我希望创建所有内容。 “Tallmaris”用户工作正常,更改的值更新没有问题(我可以看到服务器运行 UPDATE sql);相反,新用户给了我这个讨厌的日志:

[...]
User Exists (0.4ms)  SELECT 1 AS one FROM "users" WHERE "users"."name" = 'New User' LIMIT 1
ModelSector Load (8.7ms)  SELECT "user_permissions".* FROM "user_permissions" WHERE (user_id = ) ORDER BY permission_id ASC
PG::Error: ERROR:  syntax error at or near ")"

错误显然是 (user_id = ) 什么都没有,因为用户当然不存在,所以已经没有设置 user_permissions 并且我希望它们被当场创建。

【问题讨论】:

    标签: ruby-on-rails nested-attributes


    【解决方案1】:

    感谢查看其他question,我意识到这是用户验证的问题。 基本上我是在验证 threshold_values 是否在某些约束范围内求和,但这样做我可能做错了,Rails 正在从数据库加载数据,这对于现有值是可以的,但对于新值当然没有。

    我解决了这个问题,现在它可以工作了。我将把它留在这里只是为了提醒人们,一个地方的问题通常有来自其他地方的解决方案。 :)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-06-15
      • 2014-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多