2016-05-31 4 views
1

중첩 된 속성을 사용하여 has_many, through: 관계를 설정하는 방법을 알아 내려고 노력했습니다. 레일. 중첩 된 속성을 통해 많은 관계 설정하기

나는이 다음 모델 :

user.rb

class User < ApplicationRecord 
    has_many :user_tags 
    has_many :tags, through: :user_tags 

    accepts_nested_attributes_for :user_tags, 
          allow_destroy: true, 
          reject_if: :all_blank 
end 

user_tag.rb

class UserTag < ApplicationRecord 
    belongs_to :tag 
    belongs_to :user 

    accepts_nested_attributes_for :tag 

    validates :tag, :user, presence: true 
    validates :tag, :uniqueness => {:scope => :user} 
    validates :user, :uniqueness => {:scope => :tag} 
end 

tag.rb

,691 스키마
class Tag < ApplicationRecord 
    has_many :user_tags 
    has_many :users, through: :user_tags 

    validates :title, presence: true, uniqueness: true 
end 

관련

create_table "user_tags", id: :integer, force: :cascade do |t| 
    t.integer "user_id" 
    t.integer "tag_id" 
    t.index ["tag_id"], name: "index_user_tags_on_tag_id", using: :btree 
    t.index ["user_id"], name: "index_user_tags_on_user_id", using: :btree 
    end 

    create_table "tags", id: :integer, force: :cascade do |t| 
    t.string "title" 
    t.string "language" 
    t.integer "type" 
    t.datetime "created_at", null: false 
    t.datetime "updated_at", null: false 
    end 

모든 태그는 미리 정의되어, 수정할 수 없습니다. 중첩 된 속성을 통한 사용자 작성/업데이트 작업에서 user_tag 모델의 tagsusers 사이의 관계 만 설정하고 삭제하면됩니다. 같은

뭔가 :

params = { user: { 
     user_tags_attributes: [ 
      { id: 1, _destroy: '1' }, # this will destroy association 
      { tag_id: 1 }, # this will create new association with tag, which id=1 if tag present 
      { tag_title: 'name' } # this will create new association with tag, which title='name' if tag present 
     ] 
    }} 

user.update_attributes(params[:user]) 

정확한 문제는 내가 설 포닐 연결을 만들 수 없습니다,하지만 난 협회를 만들거나 업데이트 태그 할 수 있다는 것입니다.

나는 내 문제의 해결책을 발견했습니다 레일 5.0

+0

없이, tag_id에 의해 관계를 파괴 찾는 방법은? 또한 schema.rb의 관련 부분을 게시 할 수 있습니까? –

+0

@ JanBussieck : 내 질문에 schema.rb를 추가했습니다. 문제는 ONYL 연관을 만들 수 없다는 것입니다. 'user.update_attributes (user_tags_attributes : [{tag_id : 1}])'을 실행하면 ID = 1 인 태그에 대한 연관성이 사용자에게 생성되지만 오류가 발생할 것으로 예상됩니다. 'user.errors.messages => {: "user_tags.tag.title"=> [ "이미 사용되었습니다"]}' 새로운 태그를 생성하려고합니다. UserTag 테이블이 비어 있고 사용자가 관련 태그를 가지고 있지 않습니다. – Derk153

+0

글쎄, 거기에 : 당신이 이미'validates : title, presence : true, uniqueness라는 태그를 가진 태그를 만들려고하기 때문에 에러가납니다. : true'는 레코드가 생성되지 않도록합니다. –

답변

0

을 사용하고 있습니다. UserTag 인증에 실수가 있습니다.

나는

validates :tag_id, :uniqueness => {:scope => :user_id} 
    validates :user_id, :uniqueness => {:scope => :tag_id} 

validates :tag, :uniqueness => {:scope => :user} 
    validates :user, :uniqueness => {:scope => :tag} 

을 변경했습니다 및 태그 할당하고있다.

Remans은 솔루션이 어떻게 연결 ID를 정확히 발생하고있는 문제가 무엇인지