Показване на много към много чрез избор на множество

точно сега създавам формуляр, който приема много към много, използвайки избрано множество. след създаването на формуляра се опитвам да покажа информацията, събрана в страницата SHOW, но не знам как да покажа тези данни във вграден Ruby. моделът на присъединяване е CardTypesList

Модели

class Card < ActiveRecord::Base
self.inheritance_column = nil
validates :name, presence: true, uniqueness: {case_sensitive: false}

has_many :card_type_lists
has_many :card_types, through: :card_type_lists
    accepts_nested_attributes_for :card_type_lists
end

class CardType < ActiveRecord::Base
has_many :card_type_lists
has_many :cards, through: :card_type_lists
end

class CardTypeList < ActiveRecord::Base
belongs_to :cards
belongs_to :card_types
    accepts_nested_attributes_for :card_type
end

НОВ формуляр с помощта на select

<%= f.label :types %>
    <%= f.select :card_type_ids, CardTypes.all.collect{|x| [x.name, x.name]}, {},{:title => "Select a Type", :multiple => true, :class => 'selList'} %>

Вградени опити за рубини

<td class="card-td"><%= @card.card_types %></td>

Очаква се: ["Тип 1", "Тип2"] това изобразява страницата, но дава (в текст):

    <ActiveRecord::Associations::CollectionProxy::ActiveRecord_Associations_CollectionProxy_CardTypes:0x00000102f58a18>

РЕДАКТИРАНЕ: добавена е схема.

ActiveRecord::Schema.define(version: 20140120042152) do

  create_table "card_type_lists", force: true do |t|
    t.integer  "card_type_id"
    t.integer  "card_id"
    t.datetime "created_at"
    t.datetime "updated_at"
  end

  create_table "card_types", force: true do |t|
    t.string   "name"
    t.datetime "created_at"
    t.datetime "updated_at"
  end

  create_table "cards", force: true do |t|
    t.string   "name"
    t.string   "set"
    t.string   "card_types"
    t.string   "colors"
    t.string   "cost"
    t.string   "rarity"
    t.string   "oracle"
    t.float    "value"
    t.integer  "number_owned"
    t.string   "notes"
    t.string   "img_link"
    t.datetime "created_at"
    t.datetime "updated_at"
    t.integer  "types_mask"
  end

  add_index "cards", ["name"], name: "index_cards_on_name", unique: true

end

а това е моят контролер:

    class CardsController < ApplicationController
  def new
@card = Card.new
    @card.card_type_lists.build.build_card_type
  end

  def show
@card = Card.find(params[:id])
  end

  def create
    @card = Card.new(card_params)
    if @card.save
        redirect_to @card
    else
        render 'new'
    end
  end

  private

  def card_params
    params.require(:card).permit(:name, :set, {:card_types => []}, :color, :cost,      :rarity,:oracle,:value, :number_owned,:notes)
  end
end

person PhilVarg    schedule 20.01.2014    source източник


Отговори (1)


Би трябвало:

class CardTypeList < ActiveRecord::Base
    belongs_to :card
    belongs_to :card_type #Singular
end

Още няколко неща, за които да помислите:

  1. Вашият модел на присъединяване има ли правилните колони?
  2. Трябва да използвате accepts_nested_attributes_for
  3. Вижте как извиквате данните

Схема

Моделите за присъединяване в has_many :through трябва да имат foreign_key препратки към двата модела, към които се присъединяват. Начинът, по който правите това, е да използвате схема като тази:

card_types_lists
id | card_id | card_type_id | other | information | created_at | updated_at

Когато споменахте грешката no such column: card_type_lists.card_types_id, това обикновено означава, че или нямате правилната колона в базата данни, или препратката ви е неправилна. Гледайки го, това е вашата асоциация (препратка към множествено число вместо единствено) (коригирано по-горе)


Формуляри

Нещо, което трябва да имате предвид, е използването на accepts_nested_attributes_for за изпращане на правилните данни до вложените модели

Това е, когато искате да създадете някои записи в който и да е модел и работи, като ви позволява да дефинирате „нови“ обекти за другите си модели във вашия родителски модел, предавайки данните на дъщерните си модели, като това :

#app/models/card.rb
Class Card < ActiveRecord::Base
    has_many :card_type_lists
    has_many :card_types, through: :card_type_lists

    accepts_nested_attributes_for :card_type_lists
end

#app/models/card_type_list.rb
Class CardTypeList < ActiveRecord::Base
    belongs_to :card
    belongs_to :card_type

    accepts_nested_attributes_for :card_type
end

#app/controllers/cards_controller.rb
def new
    @card = Card.new
    @card.card_types_lists.build.build_card_type
end

Данни

Ако искате да покажете вашите асоциативни данни правилно, трябва да опитате това:

#app/views/cards/show.html.erb
<%= @card.card_types %>
person Richard Peck    schedule 20.01.2014
comment
промених модела на присъединяване към единствено число, добавих приема вложени атрибути за и добавих линията за изграждане, но все още получавам постоянната грешка на единицата. Добавих моята схема в моята OP, мисля, че моите типове атрибути може да са грешни в таблицата с карти - person PhilVarg; 20.01.2014
comment
така че получих изобразяването на страницата, но сега обаче първоначалният ми въпрос все още виси. Опитах ‹%= @card.card_types %›, но той просто показва големия етикет, а не действителния масив от данни, които се опитвам да съхраня/покажа. - person PhilVarg; 20.01.2014
comment
добре, най-накрая го разбрах! (след като направи всички предложени от вас промени) контролерът ми трябваше да промени :card_types на :card_type_ids def card_params params.require(:card).permit(:name, :set, {:card_type_ids =› []}, :color, :cost , :rarity,:oracle,:value, :number_owned,:notes) край след това във вградения ruby ​​SHOW файл, който направих (във вградени тагове) @card.card_types.each_index do |i| @card.card_types[i][име] край, благодаря за помощта ти, Рик! може да имам някои проблеми по-късно, когато внедря редактиране, но ще пресечем тази река, когато стигнем там, хаха - person PhilVarg; 21.01.2014