轨道上的红宝石 - 关系has_and_belongs_to_many不保存数据



我已经迁移了tags_words

class CreateTagsWords < ActiveRecord::Migration
  def change
    create_table :tags_words, id: false do |t|
       t.references :tag
       t.references :word
     end
     add_index :tags_words, :tag_id
     add_index :tags_words, :word_id
  end
end

模型词和标签:

class Word < ActiveRecord::Base
    attr_accessible :namelanguage1, :namelanguage2, :tags_attributes
    has_and_belongs_to_many :tags
    def self.search(search)
        if search
            find(:all, :conditions => ['namelanguage1 LIKE ?', "%#{search}%"])
        else
            find(:all)
        end
    end
end
class Tag < ActiveRecord::Base
    attr_accessible :name, :language_user_id
    has_and_belongs_to_many :words
    def self.search(search)
        if search
            find(:all, :conditions => ['name LIKE ?', "%#{search}%"])
        else
            find(:all)
        end
    end
end

和当我将标签添加到单词,然后保存它不保存在db(当我写在rails控制台Words.find(1).tags我得到空数组。

你需要使用<<ActiveRecord方法添加到各自的集合中:

#app/controllers/words_controller.rb
def add_tag
    word = Word.find(params[:id])
    tag = Tag.find(params[:id])
    word.tags << tag
end

你的问题要么是你没有正确保存你的数据,要么是没有正确调用它。


如果您想在创建了新的word之后向wordtags集合添加标签,您可以这样做:

#app/controllers/words_controller.rb
def create
    @word = Word.new(word_params)
    @word.save
end
private
def word_params
    params.require(:word).permit(:namelanguage1, :namelanguage2, tag_ids: [])
end
#app/models/word.rb
Class Word < ActiveRecord::Base
    attr_accessor :tag_ids
    after_create :add_tags
    def add_tags
       if tag_ids
           tag = Tag.find(tag_ids)
           tags << tag
       end
    end
end

最新更新