【问题标题】:No such column for dependent :destroy on has_many, belongs_to relationship没有这样的依赖列:destroy on has_many, belongs_to 关系
【发布时间】:2015-11-15 19:38:06
【问题描述】:

我有一个简单的 has_many,belongs_to 关联。

class Actor < ActiveRecord::Base
    belongs_to :movie
end

class Movie < ActiveRecord::Base
    has_many :actors, dependent: :destroy
    after_save :fill_actors_table
    validates_presence_of :title

    def fill_actors_table
       movie_list = Imdb::Search.new("Lion King")
      new_movie = movie_list.movies.first
      id = new_movie.id

      i = Imdb::Movie.new("#{id}")
      i.cast_members.each do |actor_name|
         actor_image = Google::Search::Image.new(:query => actor_name).first
         actor_image_url = actor_image.uri
         Actor.create(:name => actor_name, :file => actor_image_url)
      end
   end

我的架构如下所示:

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

  create_table "actors", force: true do |t|
     t.string   "name"
     t.string   "file"
     t.integer  "actor_id",   limit: 255
     t.datetime "created_at"
     t.datetime "updated_at"
   end

  create_table "movies", force: true do |t|
     t.string   "title"
     t.datetime "created_at"
     t.datetime "updated_at"
   end
 end

但我总是收到错误

SQLite3::SQLException: no such column: actors.movie_id: SELECT "actors".* FROM "actors" WHERE "actors"."movie_id" = ?

我不在任何地方使用movie_id!!!

电影控制器代码:

class MoviesController < ApplicationController
  before_action :set_movie, only: [:show, :edit, :update, :destroy]

  # GET /movies
  # GET /movies.json
  def index
    @movies = Movie.all
  end

  # GET /movies/1
  # GET /movies/1.json
  def show
  end

  # GET /movies/new
  def new
    @movie = Movie.new
  end

  # GET /movies/1/edit
  def edit
  end

  # POST /movies
  # POST /movies.json
  def create
    @movie = Movie.find_or_create_by(movie_params)

    respond_to do |format|
      if @movie.save
        format.html { redirect_to @movie, notice: 'Movie was successfully created.' }
        format.json { render :show, status: :created, location: @movie }
      else
        format.html { render :new }
        format.json { render json: @movie.errors, status: :unprocessable_entity }
      end
    end
  end

  # PATCH/PUT /movies/1
  # PATCH/PUT /movies/1.json
  def update
    respond_to do |format|
      if @movie.update(movie_params)
        format.html { redirect_to @movie, notice: 'Movie was successfully updated.' }
        format.json { render :show, status: :ok, location: @movie }
  else
        format.html { render :edit }
        format.json { render json: @movie.errors, status: :unprocessable_entity }
      end
    end
  end

  # DELETE /movies/1
  # DELETE /movies/1.json
  def destroy
    @movie.destroy
    respond_to do |format|
      format.html { redirect_to movies_url, notice: 'Movie was successfully destroyed.' }
      format.json { head :no_content }
    end
  end

  private
    # Use callbacks to share common setup or constraints between actions.
    def set_movie
      @movie = Movie.find(params[:id])
    end

    # Never trust parameters from the scary internet, only allow the white list through.
    def movie_params
      params.require(:movie).permit(:title)
    end


end

Actors 控制器刚刚生成,大部分情况下与电影控制器相同。


我想要完成的事情: 搜索电影。电影名称保存在电影数据库中。然后它使用 imdb gem 提取电影中的演员列表,并使用 google-search gem 搜索他们的图像。图片 url 和演员名称保存在演员数据库中。

我注意到,当我放入电影时,有时似乎会列出两次演员的名字(好像有两个 for 循环)。我不知道我在哪里有可能让它运行两次的代码。

这确实是我在整个项目中编写的除了基本表单之外的唯一代码。

【问题讨论】:

  • 请贴出控制器代码。这里没有足够的信息来建立上下文。
  • @ValAsensio 我已经更新了更多信息!

标签: ruby-on-rails ruby-on-rails-4


【解决方案1】:

您需要模型中带有belongs_to的外键。

使用时:

belongs_to :some_model

rails 假设 :some_model_key 在模型中。您的演员模型中没有 :movie_id ,因此当您尝试引用电影的演员时,rails 会在您的演员模型中查找 :movie_id 并且找不到它。您可以使用active migration. 添加此列

【讨论】:

  • 谢谢! add_index :actor, :movie_id 是否与 add_foreign_key :actor, :movies 相同。我可以手动插入movie_id作为整数作为外键吗?
  • 我会使用他们的 add_foreign_key 方法,因为它是最简单的。如果您愿意,可以手动将索引添加为 int。只要确保调用它:movie_id。
  • 嗯,这让我可以删除电影,但不会导致删除电影时删除演员。我有向后的关联吗?如果您有时间,我将非常感谢您的帮助。非常感谢!
  • 发现您的问题。当您创建与电影无关的演员时,您只需创建他们。您需要将 :movie_id => id 添加到您的 create 方法或使用 build 方法。 build 方法被认为是更好的形式。阅读它here
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-09-26
  • 1970-01-01
  • 1970-01-01
  • 2016-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多