2016-04-23 14 views
1

FormularErstellen Formular für mehrere Aufzählungs Auswahl Schienen

<%= form_for :article, url: articles_path, html: {multipart: true } do |f| %> 

<p> 
<%= f.label :source %><br> 
<%= f.text_field :source %> 
</p> 
<p> 
<%= f.label :title %><br> 
<%= f.text_field :title %> 
</p> 
<p> 
<%= f.label :artwork %><br> 
<%= f.text_field :remote_artwork_url %> 
</p> 

<%= f.select :article_type, Article.article_types.keys, {}, class: 'article-article_type-select' %> 

<p> 
<%= f.submit %> 
</p> 


<% end %> 

Modell

class Article < ActiveRecord::Base 

enum article_type: [:headline, :news, :editorial, :political, :social, :sports, :food] 
scope :by_type, -> { where(article_type: [0..2, 4]) } 

end 

-Controller

class ArticlesController < ApplicationController 
def new 
    if current_user.admin != true 
     flash[:danger] = "You are not permitted to sumbit articles!" 
     redirect_to root_url 
    else 
     @article = Article.new 
    end 
    end 

    def show 
    @article = Article.approved.find(params[:id]) 
    end 

    def create 
    if current_user.admin != true 
     redirect_to root_url 
    else 
    @article = current_user.articles.build(article_params) 
    @article.save 
     if @article.errors.any? 
     flash[:danger] = "Article failed!" 
     redirect_to 'new_article_path' 
     else 
     flash[:success] = "Article created!" 
     redirect_to new_article_path 
     end 
    end 
    end 

def index 
    @articles = Article.approved.all 
end 

private 

    def article_params 
    params.require(:article).permit(:artwork, :source, :title, :remote_artwork_url, :article_type) 
    end 

end 

Schema

create_table "articles", force: :cascade do |t| 
t.string "title" 
t.string "source" 
t.string "artwork" 
t.integer "article_type" 
t.integer "user_id" 
t.datetime "created_at",     null: false 
t.datetime "updated_at",     null: false 
t.boolean "approved",  default: false 
end 

Ich möchte jedem Artikel mehrere enum zuweisen können. Momentan akzeptiert mein Formular nur eine Enum-Auswahl und ich bin mir nicht sicher, ob ich die Tabelle/das Schema in ein Array ändern muss, um mehrere Enum-Selektionen zu akzeptieren. Außerdem habe ich diesen Code vor einer Weile geschrieben und ich erinnere mich nicht mehr daran, was { where(article_type: [0..2, 4]) } bedeutet.

Antwort

1

Spalten vom Typ enum können nur einen Wert zugewiesen werden. Das ist der Sinn von ihnen. Wenn Sie mehrere Werte speichern müssen, kann dies ein Hinweis darauf sein, dass die Daten umgestaltet werden müssen.

scope :by_type, -> { where(article_type: [0..2, 4]) } 

Die obige Abfrage erhält alle Artikel mit einem Typ 0 oder 1 oder 2 oder 4. Es führt zu einem der folgenden Abfrage

SELECT "articles".* FROM "articles" WHERE ("articles"."id" = 4 OR "articles"."id" BETWEEN 0 AND 2) 
Verwandte Themen