【问题标题】:Problems with delete records in a Join table删除联接表中的记录的问题
【发布时间】:2012-01-22 16:15:52
【问题描述】:
class Program < ActiveRecord::Base
 belongs_to :channel
end


class ProgramSchedule < ActiveRecord::Base
  belongs_to :program
end

Schema.rb

create_table "channels", :force => true do |t|
    t.string   "site"
    t.string   "name"
    t.string   "icon"
    t.string   "type"
    t.string   "country"
    t.integer  "ordertab"
    t.datetime "created_at"
    t.datetime "updated_at"
    t.boolean  "homepage"
  end

  add_index "channels", ["site"], :name => "index_channels_on_site", :unique => true

  create_table "program_schedules", :force => true do |t|
    t.integer  "program_id"
    t.datetime "start"
    t.datetime "stop"
  end

  add_index "program_schedules", ["program_id"], :name => "index_program_schedules_on_program_id"

  create_table "programs", :force => true do |t|
    t.integer  "channel_id"
    t.string   "title"
    t.string   "subtitle"
    t.text     "description"
    t.float    "official_rating"
    t.float    "rating"
    t.string   "type"
    t.integer  "likes"
    t.datetime "created_at"
    t.datetime "updated_at"
  end

  add_index "programs", ["channel_id"], :name => "index_programs_on_channel_id"
  add_index "programs", ["title", "channel_id"], :name => "index_programs_on_title_and_channel_id", :unique => true

我必须运行这个 SQL 查询:

  DELETE program_schedules.*
 FROM program_schedules INNER JOIN programs ON program_schedules.pid = programs.id
                        WHERE programs.channel_id = '1'
                        AND (
                               program_schedules.start >= '2011-12-12'
                                AND program_schedules.start <= '2011-12-12'
                           )

在 Ruby on Rails 中...

ProgramSchedule.joins(:program).delete_all(
    :start => (dates_array.min)..(dates_array.max),
    :programs => {:channel_id => 1}
    )

错误:(ActiveRecord::StatementInvalid) /Library/Ruby/Gems/1.8/gems/activerecord-3.1.3/lib/active_record/connection_adapters/mysql2_adapter.rb:283:in `query':

     Mysql2::Error: Unknown column 'programs.channel_id' in 'where clause':
     DELETE FROM `program_schedules` WHERE `programs`.`channel_id` = 1 AND (`program_schedules`.`start` BETWEEN '2011-12-09 23:00:00' AND
 '2011-12-10 22:20:00') 

【问题讨论】:

  • 你能发布你的表结构吗?
  • 好的,发布表结构@BryceAtNetwork23

标签: ruby-on-rails ruby ruby-on-rails-3 activerecord join


【解决方案1】:

您的表实际上是称为programs(带有尾随s)还是program(没有)。 因为在您的手写查询中,您引用了没有“s”的表,而在 Rails 查询中...

【讨论】:

  • 我认为用单个查询字符串是不可能实现的。您是否尝试过选择所需的记录,然后在另一行中对项目调用 delete_all?
【解决方案2】:

生成的 SQL 似乎并未实际执行连接。尝试像这样重组查询:

ProgramSchedule.joins(:program)
               .where(start: (dates_array.min) ..(dates_array.max)
               .where(programs: {channel_id: 1})
               .delete_all

您不必使用 2 个 where 子句,我这样做只是为了将我的连接条件与原始表上的条件分开。

【讨论】:

    猜你喜欢
    • 2015-08-01
    • 1970-01-01
    • 2015-03-04
    • 1970-01-01
    • 2013-07-06
    • 1970-01-01
    • 1970-01-01
    • 2020-03-25
    • 1970-01-01
    相关资源
    最近更新 更多