我使用Rails 4.1和Postgresql(带PG gem)作为我的数据库。从公司到省份,我有一个非常多的联盟,有一个叫做区域的联接表。现在显然,Regions表没有主键,因为我使用{:id =>假的。但是,当我尝试使用依赖破坏或只是简单地在区域对象上调用destroy时,我自己得到了这个错误:
ERROR: zero-length delimited identifier at or near """"
LINE 1: DELETE FROM "regions" WHERE "regions"."" = $1
我知道问题是由于缺少Regions表的主键引起的。奇怪的是,如果我将主键添加回表中,则销毁工作正常并且没有错误。但是,如果我从表中删除主键,则会返回错误。我知道这与postgres有关但我不知道如何解决这个问题而不必在我的Regions表中添加主键列。
这是实际查询
[DEBUG] [AdminUser Load (0.4ms) SELECT "admin_users".* FROM "admin_users" WHERE "admin_users"."id" = 1 ORDER BY "admin_users"."id" ASC LIMIT 1] (pid:29655)
[DEBUG] [Province Load (0.2ms) SELECT "provinces".* FROM "provinces" WHERE "provinces"."id" = $1 LIMIT 1 [["id", 5]]] (pid:29655)
[DEBUG] [ (0.1ms) BEGIN] (pid:29655)
[DEBUG] [Region Load (0.3ms) SELECT "regions".* FROM "regions" WHERE "regions"."province_id" = $1 [["province_id", 5]]] (pid:29655)
[ERROR] [PG::SyntaxError: ERROR: zero-length delimited identifier at or near """"
LINE 1: DELETE FROM "regions" WHERE "regions"."" = $1
答案 0 :(得分:15)
你想要单引号而不是空字符串周围的双引号,双引号是分隔标识符,""不是一个有意义的标识符。
尝试:
WHERE 'regions'.'' = $1
或至少:
WHERE "regions".'' = $1
答案 1 :(得分:13)
尝试设置dependent: :delete_all
。
示例(不完全确定如何设置多对多关系)。
#models / region.rb
...
has_many:provinces_regions,dependent :: delete_all
has_many:provinces,::: provinces_regions
...
:destroy /:destroy_all 将通过调用destroy方法删除关联对象,从而调用回调(:before_destroy,:after_destroy等)
:delete /:delete_all 会删除关联的对象而不调用其destroy方法。
答案 2 :(得分:1)
由于这里没有任何答案对我有用,我想我会包含我的自定义修复程序。不确定您的用例的翻译是什么,但我希望我的策略的要点是明确的。
我也在使用自定义主键(uuid)。为了删除我的连接表上的记录,我跳过了实际删除调用的活动记录,而是使用了SQL。
uid = BucketListPhoto.find_by(bucket_list_id: 12, photo_id: 4).uid
deleted_uids = ActiveRecord::Base.connection.execute(
"DELETE FROM bucket_list_photos WHERE uid='#{uid}' RETURNING uid"
).to_a.map { |record| record['uid'] }
我覆盖了BucketListPhoto#destroy
来使用它。
我也尝试覆盖BuckerListPhoto::ActiveRecord::Query#destroy_all
但是无法成功传递uid数组(用单个查询删除多个)。
答案 3 :(得分:0)
基于Alex Carol的回答,但解决方案却完全不同。
如果有人这样做:
<div><form method="post" id="form1" name="form1" action="" >
<input name="download" id="download" type="submit" value="Download" />
</form></div>
<?php
if (isset($_POST['download'])) {
do{
$file=$row_g['image_name'];
$download_path = 'upload/'.$file;
$file_to_download = $download_path;
header("Expires: 0");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache"); header("Content-type: application/file");
header('Content-length: '.filesize($file_to_download));
header('Content-disposition: attachment;
filename='.basename($file_to_download));
readfile($file_to_download);
} while ($row_g = mysqli_fetch_assoc($result_g));
}
?>
并遇到了这个问题,那么我想你可能是这样做的:
# models/region.rb
...
has_many :provinces_regions, dependent: :destroy_all
has_many :provinces, through: :provinces_regions
...
如果以上情况成立,那么Rails会尝试使用create_table :provinces_regions, id: false do |t|
t.belongs_to :regions, index: true
t.belongs_to :provinces, index: true
end
来运行销毁前的回调。因此,给它一个id
:
id
因此,您可以继续使用create_table :provinces_regions do |t|
t.belongs_to :regions, index: true
t.belongs_to :provinces, index: true
end
并使用需要dependent: :destroy_all
的回调和其他功能。
答案 4 :(得分:0)
问题是“”更改参数”
来自:
DELETE FROM "regions" WHERE "regions"."" = $1
收件人:
DELETE FROM "regions" WHERE "regions".'' = $1