如何从连接表中删除记录?

时间:2015-07-08 12:19:13

标签: ruby-on-rails ruby-on-rails-4

请帮助解决问题。

表格帖子

var DropdownButton = ReactBootstrap.DropdownButton;
var MenuItem = ReactBootstrap.MenuItem;

var Hello = React.createClass ({
    getInitialState() { 
        return { key: null }
    },

    onSelect(key) {
        this.setState({ key: key });
    },

    render() {
        var selected = this.state.key ? <p>Selected: {this.state.key}</p> : '';
        return (<div>
        <DropdownButton bsStyle="primary" title="Test" onSelect={this.onSelect}>
          <MenuItem eventKey='1' active={this.state.key==='1'}>Action</MenuItem>
          <MenuItem eventKey='2' active={this.state.key==='2'}>Another action</MenuItem>
          <MenuItem eventKey='3' active={this.state.key==='3'}>Active Item</MenuItem>
          <MenuItem divider />
          <MenuItem eventKey='4' active={this.state.key==='4'}>Separated link</MenuItem>
        </DropdownButton>
        {selected}
        </div>);
    }
});

React.render(<Hello/>, document.getElementById('container'));

表格标签

create_table "posts", force: :cascade do |t|
  t.string   "title"
  t.text     "body"
end

加入表

create_table "tags", force: :cascade do |t|
  t.string   "tagname"
end

模特邮报

create_table "posts_tags", id: false, force: :cascade do |t|
  t.integer "post_id"
  t.integer "tag_id"
end

模型标签

class Post < ActiveRecord::Base
  has_and_belongs_to_many :tags
end

我需要删除一些关联表posts_tags。

我从表单集ID标签中获取:

class Tag < ActiveRecord::Base
  has_and_belongs_to_many :posts
end

这是我的控制器处理此set id_tags:

[3, 18, 21]

因此,我收到以下错误消息:

  def update
    if @post.update_attributes(post_params)
      #add_new_tags(@post)
      p '------------------1'
      p params['delete_tags']
      p '------------------2'
      destroy_tags(params['delete_tags'], @post)
      flash[:success] = t :post_updated
      redirect_to user_post_path(@user, @post)
    else
      flash[:error] = t :post_not_updated
      render  'edit'
    end
  end

  private

    def destroy_tags(tags,post)
      tags.each do |tag|
          p '=================='
          p tag
          tag_del = post.tags.find_by_post_id(:post_id => post.id)
          if teg_del
            post.tags.delete(tag_del)
          end
      end
    end    

    def post_params
      params.require(:post).permit(:delete_tags)
    end  

控制台显示以下消息:

undefined method `find_by_post' for #<Tag::ActiveRecord_Associations_CollectionProxy:0x007f097ed78ac8>    

1 个答案:

答案 0 :(得分:0)

由于你有一个连接表,标签表本身没有post_id,所以find_by不起作用。但这并不是必需的,因为post.tags无论如何都会检索连接到该帖子的所有标签。

使用诸如collection_check_boxes之类的东西,你可以获得很多处理habtm关系和表格的功能,我不认为你需要额外的销毁标签方法,除非我误解了你的内容正在努力完成。您可以考虑在帖子中添加/删除标记关联,如下所示:

发布 - has_and_belongs_to_many:标签
标签 - has_and_belongs_to_many:帖子

发布更新表格:

<legend>Tags</legend>
<div class="form-group">
  <%= f.collection_check_boxes(:tag_ids, Tag.all, :id, :name) %>
</div>

确保允许:tag_ids =&gt; []在你的控制器的post_params

将允许您通过添加已检查的任何新标签并删除表单中未选中的任何标签来更新属于帖子的标签,并且您可以正常创建和更新控制器操作,而无需额外的destroy_tags方法