将数组发布到数据库rails

时间:2016-01-21 09:46:40

标签: ruby-on-rails activerecord

我有两个型号

class Article < ActiveRecord::Base
  mount_uploader :photo, ImageUploader
  has_many :comments
  has_many :article_tags
  has_many :tags, :through => :article_tags
  belongs_to :category

  validates :title, presence: true
  validates :text, presence: true
end

ArticleTag

class ArticleTag < ActiveRecord::Base
  belongs_to :article
  belongs_to :tag
end

标签

class Tag < ActiveRecord::Base
 has_many :article_tags
 has_many :articles, :through => :article_tags
end

这就是我在。

中获取标签的方法
@article = params[:article]
@tags = params[:tag_ids]

现在真正的问题在于将文章发布到文章表中,以及将与各种文章相关联的标签发布到article_tags表中。

更新

我正在使用simple_form_for gem,它允许我使用关联方法在引导程序中创建多选,因此问题不是将标记放入表单中,而是将它们发布到数据库中(为article_tags创建新行)。我希望能够通过@article.article_tags检索它们。这就是尝试但我不知道它是否正确。

@article_params = params[:article]
  article_params[:tag_ids].each do |tag|
  @article_tag =    @article.article_tags.build('article_id'=>@article.id,'tag_id'=>tag)
      @article_tag.save
end

def article_params
params.require(:article).permit(:title,:category_id,:text,     :photo,:tag_ids => [])
end

这必须在创建文章时完成,就像在同一个方法中同时发布到两个表,即文章和article_tags表。

2 个答案:

答案 0 :(得分:1)

您可以使用concept of nested attributes in rails来解决此问题。

您可以找到示例/解释on this rails cast

当您使用嵌套属性时,您不需要单独获取控制器中的articlestags,然后担心保存这些属性,rails会自动处理它。

答案 1 :(得分:0)

您有两种选择:

  1. 如果您想将现有tags与新article相关联,则只需填充tag_ids
  2. 如果您想创建 tags,则必须使用accepts_nested_attributes_for
  3. 现有标签

    将现有标签添加到文章很简单:

    #app/models/article.rb
    class Article < ActiveRecord::Base
      has_many :article_tags
      has_many :tags, through: :article_tags
    
      validates :title, :text, presence: true #-> declare multiple validations on same line
    end
    
    #app/controllers/articles_controller.rb
    class ArticlesController < ApplicationController
       def create
          @article = Article.new article_params
          @article.save
       end
    
       private
    
       def article_params
          params.require(:article).permit(tag_ids: [])
       end
    end
    

    使用collection_singular_ids属性指定&#34;加入&#34;父母的记录:

    #app/views/articles/new.html.erb
    <%= form_for @article do |f| %>
       <%= f.collection_select :tag_ids, Tag.all, :id, :name %>
       <%= f.submit %>
    <% end %> 
    

    这会将tag分配给您的新article,但 将允许您创建新代码。

    新标签

    如果您希望使用article创建新代码,则必须accepts_nested_attributes_for使用fields_for

    #app/controllers/articles_controller.rb
    class ArticlesController < ApplicationController
       def new
         @article = Article.new
         @article.tags.build
       end
    
       def create
         @article = Article.new article_params
         @article.save
       end
    
       private
    
       def article_params
         params.require(:article).permit(tags_attributes: [:name])
       end
    end
    
    #app/views/articles/new.html.erb
    <%= form_for @article do |f| %>
       <%= f.fields_for :tags do |t| %>
          <%= t.text_field :name %>
       <% end %>
       <%= f.submit %>
    <% end %>
    

    这会创建新的代码,并自动将其与新的article相关联。