Проблема при обновлении записи с использованием ассоциации записей has_many: through - PullRequest
1 голос
/ 05 июля 2011

Я использую Ruby on Rails 3.0.7 и у меня проблема с проверкой связанной модели для обновляемого действия контроллера.Я использую ассоциацию has_many: through, чтобы обрабатывать отношения между категориями пользователей.

В модели User у меня есть:

has_many :user_category_relationships,
  :autosave    => true,
  :dependent   => :destroy
has_many :user_categories,
  :through     => :user_category_relationships,
  :source      => :user_category,
  :dependent   => :destroy

В файле просмотра _form у меня есть:

<% @current_user.user_categories.each do |user_category| %>
  <%= check_box_tag :user_category_ids, user_category.id, @user.user_categories.include?(user_category), :name => 'user_relationships[user_category_ids][]' %>
  <%= label_tag "user_category_#{user_category.id}", user_category.name %>
<% end %>

В модели UserCategoryRelationship Ihave:

belongs_to :users
belongs_to :categories

# Validation
validates :name_id,
  :presence   => true,
  :uniqueness => {
    :scope          => [:created_by_user_id, :category_id]
  }
validates :category_id,
  :presence   => true,
  :uniqueness => {
    :scope          => [:created_by_user_id, :name_id]
  }
validates :created_by_user_id,
  :presence   => true,
  :uniqueness => {
    :scope          => [:category_id, :name_id]
  }

В UsersController у меня есть:

def create
  ...

  # `params[:user_relationships][:user_category_ids]` used below are id values 
  # related to user-category relationships.

  unless params[:user_relationships][:user_category_ids]
    # Set default user category if not selected.
    @user.user_category_relationships.build(
      :category_id        => '1',
      :created_by_user_id => @current_user.id,
      :name_id            => @name.id
    )
  else
    params[:user_relationships][:user_category_ids].each { |user_category_id|
      @user.user_category_relationships.build(
        :category_id        => user_category_id,
        :created_by_user_id => @current_user.id,
        :name_id            => @name.id
      )
    }
  end

  if @user.save
    ...
  end
end

def update
  ...

  # Note: The following code is equal to that in the controller 'create' 
  # action. However here is my problem because validation (read after 
  # for more information about).

  unless params[:user_relationships][:user_category_ids]
    # Set default user category if not selected.
    @user.user_category_relationships.build(
      :category_id        => '1',
      :created_by_user_id => @current_user.id,
      :name_id            => @name.id
    )
  else
    params[:user_relationships][:user_category_ids].each { |user_category_id|
      @user.user_category_relationships.build(
        :category_id        => user_category_id,
        :created_by_user_id => @current_user.id,
        :name_id            => @name.id
      )
    }
  end

  if @user.update_attributes(params[:user])
    ...
  end
end

Приведенный выше код работает за исключением действия update: когда я пытаюсь запустить, я получаю всегдата же ошибка, также .

# Validation errors on updating the 'user_category_relationships' associated model
:"user_category_relationships.category_id"        =>["has already been taken"]
:"user_category_relationships.name_id"            =>["has already been taken"]
:"user_category_relationships.created_by_user_id" =>["has already been taken"]

То, что я хотел бы сделать , так как я не использую "магический \ автоматический способ RoR" вообще (то есть я не использую метод collection_singular_ids - см. также this и this ), для правильной работы update действие контроллера, так что я все еще могу использовать «автоматическое» создание отношений пользовательской категории (срабатывает на save и update_attributes(...) методах) , но не генерировать вышеуказанные ошибки проверки (то естьсоздать действительные данные в таблице базы данных). Как я могу это сделать?Что вы посоветуете по этому вопросу?

PS: Я попал в беду в действии update, точно выясняющем, как "выбирать" \ "фильтровать" и "кодировать" записи дляобновить, создать и удалить в базе данных, имеющей в качестве входных данных параметры [: user_relationships] [: user_category_ids].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...