0

Я создал HABTM ассоциацию НПЗ СХ, но она возвращает ошибку, как показано ниже:Как вставить данные в таблице соединения на основе HABTM ассоциации рельсы 4

ActiveRecord::StatementInvalid: PG::UndefinedTable: ERROR: relation "refinery_georgiantoast_restaurant_wines" does not exist 
LINE 5:    WHERE a.attrelid = '"refinery_georgiantoast_r... 
             ^
:    SELECT a.attname, format_type(a.atttypid, a.atttypmod), 
        pg_get_expr(d.adbin, d.adrelid), a.attnotnull, a.atttypid, a.atttypmod 
       FROM pg_attribute a LEFT JOIN pg_attrdef d 
        ON a.attrelid = d.adrelid AND a.attnum = d.adnum 
       WHERE a.attrelid = '"refinery_georgiantoast_restaurant_wines"'::regclass 
       AND a.attnum > 0 AND NOT a.attisdropped 
       ORDER BY a.attnum 

/поставщик/расширение/georgiantoasts/приложение/модели /refinery/georgiantoast/restaurant.rb

Вот мой restaurant.rb модель:

module Refinery 
    module Georgiantoast 
    class Restaurant < Refinery::Core::BaseModel 

     validates :title, :presence => true, :uniqueness => true 

     belongs_to :avatars, :class_name => '::Refinery::Image' 

     has_many :restaurants_wines 

     has_many :wines, :through => :restaurants_wines 

     # To enable admin searching, add acts_as_indexed on searchable fields, for example: 
     # 
     # acts_as_indexed :fields => [:title] 

    end 
    end 
end 

/vendor/extensions/georgiantoasts/app/models/refinery/georgiantoast/wine.rb

Вот мой wine.rb модель:

module Refinery 
    module Georgiantoast 
    class Wine < Refinery::Core::BaseModel 

     validates :title, :presence => true, :uniqueness => true 

     belongs_to :avatars, :class_name => '::Refinery::Image' 

     has_many :restaurants_wines 

     has_many :restaurants, :through => :restaurants_wines 

     # To enable admin searching, add acts_as_indexed on searchable fields, for example: 
     # 
     # acts_as_indexed :fields => [:title] 

    end 
    end 
end 

/поставщик/расширения/georgiantoasts/приложение/модели/НПЗ/georgiantoast/restaurant_wines.rb

Вот мой присоединиться табличная модель restaurant_wines.rb

module Refinery 
    module Georgiantoast 
    class RestaurantWine < Refinery::Core::BaseModel 

     belongs_to :wine 

     belongs_to :restaurant 

     # To enable admin searching, add acts_as_indexed on searchable fields, for example: 
     # 
     # acts_as_indexed :fields => [:title] 

    end 
    end 
end 

/vendor/extensions/georgiantoasts/app/controllers/refinery/georgiantoast/admin/restaurants_controller.rb

Здесь restaurants_controller.rb Контроллер:

module Refinery 
    module Georgiantoast 
    module Admin 
     class RestaurantsController < ::Refinery::AdminController 

     crudify :'refinery/georgiantoast/restaurant' 

     private 

     # Only allow a trusted parameter "white list" through. 
     def restaurant_params 
      params.require(:restaurant).permit(:title, :description, :address, :town, :state, :lat, :lng, :avatars_id, :wine_ids => []) 
     end 
     end 
    end 
    end 
end 

/поставщики/расширения/georgiantoasts/app/views/refinery/georgiantoast/admin/restaurants/_form.html.erb

Вот ресторан _form.html.erb формы:

<%= form_for [refinery, :georgiantoast_admin, @restaurant] do |f| -%> 
    <%= render '/refinery/admin/error_messages', 
       :object => @restaurant, 
       :include_object_name => true %> 

    <div class='field'> 
     <%= f.label :title -%> 
     <%= f.text_field :title, :class => 'larger widest' -%> 
    </div> 

    <div class='field'> 
     <%= render '/refinery/admin/wysiwyg', 
       :f => f, 
       :fields => [:description], 
       :object => "georgiantoast/restaurant" -%> 
    </div> 

    <div class='field'> 
     <%= f.label :address -%> 
     <%= f.text_field :address -%> 
    </div> 

    <div class='field'> 
     <%= f.label :wine -%> 
     <%= select_tag "#{f.object_name}[wine_ids][]", options_for_select(Refinery::Georgiantoast::Wine.all.collect { |wine| [wine.title, wine.id] }), {multiple: true} -%> 
    </div> 


    <%= render '/refinery/admin/form_actions', :f => f, 
       :continue_editing => false, 
       :delete_title => t('delete', :scope => 'refinery.restaurants.admin.restaurants.restaurant'), 
       :delete_confirmation => t('message', :scope => 'refinery.admin.delete', :title => @restaurant.title) -%> 
<% end -%> 

Вот файл миграция:

class CreateJoinTableRestaurantsWines < ActiveRecord::Migration 
    def change 
    create_join_table :restaurants, :wines do |t| 
     t.index :restaurant_id 
     t.index :wine_id 
    end 
    end 
end 

Когда я отправляю свою форму она не выполняет никаких действий в вызове присоединиться к таблице ,

Если я пытаюсь запустить следующую команду на rails console она возвращает меня под ошибкой:

2.2.3 :001 > r = Refinery::Georgiantoast::Restaurant.first 
    Refinery::Georgiantoast::Restaurant Load (1.0ms) SELECT "refinery_georgiantoast_restaurants".* FROM "refinery_georgiantoast_restaurants" ORDER BY "refinery_georgiantoast_restaurants"."id" ASC LIMIT 1 
=> #<Refinery::Georgiantoast::Restaurant id: 1, title: "abc restaurant", description: "<p>abc restaurant</p>", address: "12 helifax estate", town: "helifax", state: "toronto", lat: #<BigDecimal:55fdfc0,'-0.12555555E2',18(27)>, lng: #<BigDecimal:55fde80,'0.74555555E2',18(27)>, avatars_id: 3, position: nil, created_at: "2016-08-27 11:26:29", updated_at: "2016-08-27 11:26:29"> 
2.2.3 :002 > r.wine_ids 
ActiveRecord::StatementInvalid: PG::UndefinedTable: ERROR: relation "refinery_georgiantoast_restaurant_wines" does not exist 
LINE 5:    WHERE a.attrelid = '"refinery_georgiantoast_r... 
             ^
:    SELECT a.attname, format_type(a.atttypid, a.atttypmod), 
        pg_get_expr(d.adbin, d.adrelid), a.attnotnull, a.atttypid, a.atttypmod 
       FROM pg_attribute a LEFT JOIN pg_attrdef d 
        ON a.attrelid = d.adrelid AND a.attnum = d.adnum 
       WHERE a.attrelid = '"refinery_georgiantoast_restaurant_wines"'::regclass 
       AND a.attnum > 0 AND NOT a.attisdropped 
       ORDER BY a.attnum 

    from /home/muhammad/.rvm/gems/[email protected]/gems/activerecord-4.2.6/lib/active_record/connection_adapters/postgresql_adapter.rb:592:in `async_exec' 
    from /home/muhammad/.rvm/gems/[email protected]/gems/activerecord-4.2.6/lib/active_record/connection_adapters/postgresql_adapter.rb:592:in `block in exec_no_cache' 
    from /home/muhammad/.rvm/gems/[email protected]/gems/activerecord-4.2.6/lib/active_record/connection_adapters/abstract_adapter.rb:472:in `block in log' 
    from /home/muhammad/.rvm/gems/[email protected]/gems/activesupport-4.2.6/lib/active_support/notifications/instrumenter.rb:20:in `instrument' 
    from /home/muhammad/.rvm/gems/[email protected]/gems/activerecord-4.2.6/lib/active_record/connection_adapters/abstract_adapter.rb:466:in `log' 
    from /home/muhammad/.rvm/gems/[email protected]/gems/activerecord-4.2.6/lib/active_record/connection_adapters/postgresql_adapter.rb:592:in `exec_no_cache' 
    from /home/muhammad/.rvm/gems/[email protected]/gems/activerecord-4.2.6/lib/active_record/connection_adapters/postgresql_adapter.rb:584:in `execute_and_clear' 
    from /home/muhammad/.rvm/gems/[email protected]/gems/activerecord-4.2.6/lib/active_record/connection_adapters/postgresql/database_statements.rb:160:in `exec_query' 
    from /home/muhammad/.rvm/gems/[email protected]/gems/activerecord-4.2.6/lib/active_record/connection_adapters/postgresql_adapter.rb:733:in `column_definitions' 
    from /home/muhammad/.rvm/gems/[email protected]/gems/activerecord-4.2.6/lib/active_record/connection_adapters/postgresql/schema_statements.rb:197:in `columns' 
    from /home/muhammad/.rvm/gems/[email protected]/gems/activerecord-4.2.6/lib/active_record/connection_adapters/schema_cache.rb:43:in `columns' 
    from /home/muhammad/.rvm/gems/[email protected]/gems/activerecord-4.2.6/lib/active_record/connection_adapters/schema_cache.rb:49:in `columns_hash' 
    from /home/muhammad/.rvm/gems/[email protected]/gems/activerecord-4.2.6/lib/active_record/associations/association_scope.rb:85:in `column_for' 
    from /home/muhammad/.rvm/gems/[email protected]/gems/activerecord-4.2.6/lib/active_record/associations/association_scope.rb:94:in `bind' 
    from /home/muhammad/.rvm/gems/[email protected]/gems/activerecord-4.2.6/lib/active_record/associations/association_scope.rb:103:in `last_chain_scope' 
    from /home/muhammad/.rvm/gems/[email protected]/gems/activerecord-4.2.6/lib/active_record/associations/association_scope.rb:139:in `add_constraints' 
... 9 levels... 
    from /home/muhammad/.rvm/gems/[email protected]/gems/railties-4.2.6/lib/rails/commands/console.rb:9:in `start' 
    from /home/muhammad/.rvm/gems/[email protected]/gems/railties-4.2.6/lib/rails/commands/commands_tasks.rb:68:in `console' 
    from /home/muhammad/.rvm/gems/[email protected]/gems/railties-4.2.6/lib/rails/commands/commands_tasks.rb:39:in `run_command!' 
    from /home/muhammad/.rvm/gems/[email protected]/gems/railties-4.2.6/lib/rails/commands.rb:17:in `<top (required)>' 
    from /home/muhammad/.rvm/gems/[email protected]/gems/activesupport-4.2.6/lib/active_support/dependencies.rb:274:in `require' 
    from /home/muhammad/.rvm/gems/[email protected]/gems/activesupport-4.2.6/lib/active_support/dependencies.rb:274:in `block in require' 
    from /home/muhammad/.rvm/gems/[email protected]/gems/activesupport-4.2.6/lib/active_support/dependencies.rb:240:in `load_dependency' 
    from /home/muhammad/.rvm/gems/[email protected]/gems/activesupport-4.2.6/lib/active_support/dependencies.rb:274:in `require' 
    from /home/muhammad/workspace/georgian-toast-wines/bin/rails:9:in `<top (required)>' 
    from /home/muhammad/.rvm/gems/[email protected]/gems/activesupport-4.2.6/lib/active_support/dependencies.rb:268:in `load' 
    from /home/muhammad/.rvm/gems/[email protected]/gems/activesupport-4.2.6/lib/active_support/dependencies.rb:268:in `block in load' 
    from /home/muhammad/.rvm/gems/[email protected]/gems/activesupport-4.2.6/lib/active_support/dependencies.rb:240:in `load_dependency' 
    from /home/muhammad/.rvm/gems/[email protected]/gems/activesupport-4.2.6/lib/active_support/dependencies.rb:268:in `load' 
    from /home/muhammad/.rvm/rubies/ruby-2.2.3/lib/ruby/site_ruby/2.2.0/rubygems/core_ext/kernel_require.rb:54:in `require' 
    from /home/muhammad/.rvm/rubies/ruby-2.2.3/lib/ruby/site_ruby/2.2.0/rubygems/core_ext/kernel_require.rb:54:in `require' 
    from -e:1:in `<main>' 

Все миграции уже бежал, не миграции или семя не находится на рассмотрении тоже.

ответ

0

Если вы используете form_for вы можете использовать эту приведенную ниже на ваш взгляд приложение/просмотров/рестораны/_form

<%= f.collection_select :wine_ids, @wines, :id, :name, {}, {:multiple => true} %> 

Не забывайте об этом в контроллере

params.require(:restaurant).permit(:name, :wine_ids => []) 
+0

это говорит: 'uninitialized constant Refinery :: Georgiantoast :: Restaurant :: RestaurantsWine' также это мой контроллер ресторана новый метод' def new @wines = Refinery :: Georgiantoast: : Wine.all end' Я написал его в ресторане контроллер новый метод доступа к '@ винам' – LearningROR

+0

В рельсах консоли это работает? 'Restaurant.first.wines.new' –

+0

Я попробовал: 'Refinery :: Georgiantoast :: Restaurant.first.wines.new' Он говорит:' NameError: uninitialized constant Refinery :: Georgiantoast :: Restaurant :: RestaurantsWine' – LearningROR

0

Вы появляетесь иметь опечатка в винных и ресторанных классах.Отношение должно быть через restaurant_wines, а не restaurants_wines (так что только «вино» должно быть множественным).

Вам нужно добавить wine_id и restaurant_id столбцы в таблицу соединений, если вы еще этого не сделали. После того, как они там, вы должны быть

+0

Спасибо очень много для идентификации, а также как я могу получить к нему доступ в консоли rails? Да, я добавил 'wine_id' и' restaurant_id' в таблицу соединений с именем: 'restaurants_wines' - это имя таблицы в порядке' restaurants_wines'? – LearningROR

+0

Я попробовал: 'Refinery :: Georgiantoast :: Restaurant.first.wines.new' Он говорит:' NameError: uninitialized constant Refinery :: Georgiantoast :: Restaurant :: RestaurantsWine' – LearningROR

+0

Похоже, вы все еще имеете в виду неправильные где-то в вашем приложении. Вы определенно изменили написание «restaurant_wines» в обеих отношениях has_many в вашей модели ресторана? Если да, попробовали ли вы, возможно, перезапустить консоль или сервер рельсов? Кроме того, я думаю, что способ, которым вы пытались создать запись, должен работать. – kohrVid