accept_nested_attributes_for в отношении "многие ко многим"

Я попытался найти решение для этого, но большая часть литературы посвящена тому, как создать форму, а не как сохранить материал в БД. Проблема, с которой я столкнулся, заключается в том, что 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

Разрешение кажется странным, но у каждого из них есть значение threshold_value, которое для каждого пользователя разное, поэтому оно и нужно вот так.

В любом случае, как я уже сказал, когда я 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}]
        }]
    }
}

Как видите, «Новый пользователь» не имеет идентификатора, и его записи разрешений также не имеют идентификатора, потому что я хочу, чтобы все было создано. Пользователь "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, и я хотел, чтобы они были созданы на месте.


person Tallmaris    schedule 08.11.2012    source источник


Ответы (1)


Посмотрев на этот другой вопрос, я понял, что проблема связана с проверка на пользователя. В основном я проверял, что значения threshold_values ​​суммированы в рамках определенных ограничений, но для этого я, вероятно, делал что-то не так, и Rails загружал данные из БД, что было нормально для существующих значений, но, конечно, не было ничего для новых значений.

Я исправил это, и теперь он работает. Я оставлю это здесь просто как напоминание о том, что часто проблема в одном месте имеет решения, исходящие из других мест. :)

person Tallmaris    schedule 08.11.2012