【问题标题】:Relation has_and_belongs_to_many doesn't save data关系 has_and_belongs_to_many 不保存数据
【发布时间】:2014-04-29 21:35:27
【问题描述】:

我已经迁移 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

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

【问题讨论】:

  • 你想如何拯救他们? (调用save时返回值是多少?)
  • 您需要在控制台中执行Word.find(1).tags
  • 您是否有权访问您的数据库(使用 PHPMyAdmin 之类的工具)?
  • 对不起我的错误:我写的是 Word.fond(1).tags。我通过控制器保存单词。
  • 我使用 sqlite3 在 localhost 中创建它,所以我只能通过 rails 控制台访问

标签: ruby-on-rails ruby


【解决方案1】:

您需要使用<< 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

【讨论】:

  • 我刚开始阅读这个问题,你发布了答案。 ://
  • 这不是答案 - 这只是一个建议。 OP 应该发布有关他们如何修改集合的更新。您仍然应该提供输入 - 这将帮助他们解决问题
  • 现在我改变:def word_params params.require(:word).permit(:namelanguage1, :namelanguage2, :tag_ids) end Ant 可以了 :D 但是我怎么能使用多个呢?
  • 好的,我是这样写的:tag = Tag.find(tag_ids.to_a.drop(1)) 它的工作:D非常非常非常非常非常非常感谢您的帮助。
  • +1 当然是奉献精神和解决方案。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-14
  • 1970-01-01
  • 1970-01-01
  • 2011-04-16
相关资源
最近更新 更多