71268


以下のエラーが解消できず困っております。

[code]

    ActiveRecord::StatementInvalid in NutritionsController#destroy
    Mysql2::Error: Unknown column 'favorites.true' in 'where clause'
    
[/code]

パラメータは以下になります。

[code]

    {"_method"=>"delete", "authenticity_token"=>"i0BwagvJ5opWqMTriPNDgX6HXIgqqnhUUpgUWOFPmeUVjOSkC5FOw63ZPU24kv5R0J6z4nnJqIzpsV/fUtSIQA==", "id"=>"29"}
    
[/code]

userが登録済みのnutrition（食材）を削除するという簡単な動作です。  
destroyアクションをビューから呼び出している際に発生していると思われます。  
対象のコードは以下になります。

【ビュー】index.html.erb ★末尾から３行目でdestroyアクションを呼び出しております。

[code]

    <% @nutritions.each do |nutrition| %>
            <tr height="60" class="content-post">
              <% if user_signed_in? %>
                <% if current_user.already_favorited?(nutrition, current_user) %>
                  <td class="ingredient-column fav-color" id="ingredient-column">★<%= nutrition.ingredient %>
                <% else %>
                  <td class="ingredient-column" id="ingredient-column"><%= nutrition.ingredient %>
                <% end %>
              <% else %>
                <td class="ingredient-column" id="ingredient-column"><%= nutrition.ingredient %>
              <% end %>
              <div class="more" id="more">
                <ul class="more-list" id="more-list">
                  <li>
    
                    <% if user_signed_in? %>
                      <% if current_user.already_favorited?(nutrition, current_user) %>
                        <%= link_to '解除', nutrition_favorites_path(user_id:current_user.id, nutrition_id:nutrition.id, id:0), method: :delete %>
                      <% else %>
                        <%= link_to '登録', user_favorites_path(user_id:current_user.id, nutrition_id:nutrition.id), method: :post %>
                      <% end %>
                      <% if current_user.id == nutrition.user.id %>
                        <%= link_to '編集', edit_nutrition_path(nutrition.id), method: :get %>
                        <%= link_to '削除', nutrition_path(nutrition.id), method: :delete, data: { confirm: '削除しますか？'} %>
                      <% end %>
                    <% end %>
    
[/code]

【コントローラー】★ここのdestroyアクション時にエラーが発生しております。

[code]

    class NutritionsController < ApplicationController
      before_action :move_to_index, except: [:index]
      before_action :set_nutrition, only: [:edit, :update]
    
      def index
        @nutritions = Nutrition.includes(:user).order("nutritions.id DESC")
      end
    
      def new
        @nutrition = Nutrition.new
      end
    
      def create
        Nutrition.create(nutrition_params)
      end
    
      def search
        @nutritions = Nutrition.search(params[:keyword])
      end
    
      def edit
      end
    
      def update
        @nutrition.update(nutrition_params)
      end
    
      def destroy
        nutrition = Nutrition.find(params[:id])
        nutrition.destroy   ★エラー箇所★
        redirect_back fallback_location: root_path
      end
    
    
    private
    
      def set_nutrition
        @nutrition = Nutrition.find(params[:id])
      end
    
      def nutrition_params
        params.require(:nutrition).permit(:ingredient, :calorie, :protein, :lipid, :carbohydrate, :potassium, :calcium, :iron, :vitamin_a, :vitamin_b1, :vitamin_b2, :vitamin_c, :salt_equivalent).merge(user_id: current_user.id)
      end
    
      def move_to_index
        unless user_signed_in?
          redirect_to action: :index
        end
      end
    
    end
    
[/code]

【ルーティング】routes.rb

[code]

    Rails.application.routes.draw do
      devise_for :users
      # For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html
      root to: 'nutritions#index'
      resources :nutritions do
        collection do
          get 'search'
        end
        member do
          post "add", to: "favorites#create"
        end
    
        resource :favorites, only: [:destroy]
      end
    
      resources :users do
        resources :favorites, only: [:show, :create]
      end
    
    end
    
[/code]

【モデル】favoritesという中間テーブルとアソシエーションを組んでおります。  
nutrition.rb

[code]

    class Nutrition < ApplicationRecord
      belongs_to :user
      has_many :favorites, foreign_key: true, dependent: :destroy
      has_many :fav_users, through: :favorites, source: :user
    
      with_options presence: true do
        validates :ingredient
        validates :calorie, numericality: { only_integer: true }
        validates :protein, numericality: { only_integer: true }
        validates :lipid, numericality: { only_integer: true }
        validates :carbohydrate, numericality: { only_integer: true }
        validates :potassium, numericality: { only_integer: true }
        validates :calcium, numericality: { only_integer: true }
        validates :iron, numericality: { only_integer: true }
        validates :vitamin_a, numericality: { only_integer: true }
        validates :vitamin_b1, numericality: { only_integer: true }
        validates :vitamin_b2, numericality: { only_integer: true }
        validates :vitamin_c, numericality: { only_integer: true }
        validates :salt_equivalent, numericality: { only_integer: true }
      end
    
      def self.search(search)
        if search != ""
          Nutrition.where('ingredient LIKE(?)', "%#{search}%")
        else
          Nutrition.all
        end
      end
    end
    
    
[/code]

favorite.rb

[code]

    class Favorite < ApplicationRecord
      belongs_to :user
      belongs_to :nutrition
      validates_uniqueness_of :nutrition_id, scope: :user_id
    end
    
[/code]

エラーメッセージでは `Unknown column 'favorites.true' in 'where clause'`
とありますが、今回のdestroyアクションではfavoritesに全く触れているつもりはないのですがなぜここで出てきてしまうのでしょうか。

アソシエーションにてdependent: :destroyが組んであるので試しに消去してみると以下のエラーが発生します。

[code]

    Mysql2::Error: Cannot delete or update a parent row: a foreign key constraint fails (`berries_development`.`favorites`, CONSTRAINT `fk_rails_2201ed1284` FOREIGN KEY (`nutrition_id`) REFERENCES `nutritions` (`id`))
    
[/code]

何が原因なのかがわかりません・・・  
ご教授いただけますと幸いです。


CC BY-SA 4.0
2020-10-16T09:29:04.560
71251
2020-10-17T02:19:41.960
2020-10-16T11:47:42.383
3060
42341
question
ruby-on-rails
Mysql2::Error: Unknown column 'favorites.true' in 'where clause'の対処について


`Nutrition`モデルの`has_many`アソシエーションに`foreign_key:
true`とありますが、`foreign_key`は外部キーとなる **カラムを指定する**
オプションです。（true/falseのbooleanを渡すものではない）  
そのためMySqlが「favoritesテーブルにtrueという名前のカラムはないよ」とエラーを吐いています。

外部キーとなるカラムを指定するようにしてください。  
なお、railsの命名規約に従っている（nutrition_idとしている）場合はforeign_keyオプションは必要ありません。


CC BY-SA 4.0
2020-10-17T02:19:41.960
71268
2020-10-17T02:19:41.960
9608
71251
answer