轨。通过嵌套属性设置多对多关系

时间:2016-05-31 08:27:04

标签: ruby-on-rails ruby nested-attributes ruby-on-rails-5

我一直试图弄清楚如何使用嵌套属性设置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

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

所有标签均已预定义,无法修改。 我只需要通过嵌套属性在用户的创建/更新操作中设置和销毁模型tagsusersuser_tag之间的关系。

类似的东西:

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])

确切的问题是我无法创建ONYL关联,但我可以通过关联创建或更新标记。

我正在使用 Rails 5.0

1 个答案:

答案 0 :(得分:0)

我找到了解决问题的方法。我在UserTag验证中出错了。

我已经改变了

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

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

并且标记分配正在运行。

Remans找到解决方案如何通过tag_id销毁关联,没有关联ID