- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
好吧,抛开在聊天板上询问如何“消灭孤儿”是邪恶的事实,这是我的技术问题:
我正在制作一个简单的博客站点,使用 Activerecord 和 Sinatra(我对两者都不熟悉)。我在 Post 模型和 Tag 模型之间存在“多对多”关系,并且遇到了我无法解决的错误。最后,我安排了模型和迁移,这样我就不会出错;然而,当我销毁标签的一个实例时,“posts_tags”表上的关联保留在原位(作为孤儿存在),我想知道如何销毁它们(暗示邪恶的音乐)。
谁能帮我解决这个问题?
这是我对所有三个表的迁移:
class CreatePostsTable < ActiveRecord::Migration[5.2]
def change
create_table :posts do |t|
t.string :title, default: 'title here'
t.string :content, default: 'content here'
t.belongs_to :blog, index: true
t.timestamps
end
end
end
class CreateTagTable < ActiveRecord::Migration[5.2]
def change
create_table :tags do |t|
t.string :name, unique: true
end
end
end
class CreatePostsTagsTable < ActiveRecord::Migration[5.2]
def change
create_table :posts_tags, :id => false do |t|
t.belongs_to :tag, index: true
t.belongs_to :post, index: true
# t.integer :post_id
# t.integer :tag_id
end
end
end
这是我的三个模型:
文件名:Post_Tag(我已经命名并在几天内重新命名了这个类和文件名)。
class PostsTag < ActiveRecord::Base
# self.table_name = "posts_tags" #had to add this line for seed file not to give errors
belongs_to :post
belongs_to :tag
end
class Post < ActiveRecord::Base
belongs_to :blog
has_many :posts_tags
has_many :tags, :through => :posts_tags
has_many :comments, dependent: :destroy
end
class Tag < ActiveRecord::Base
has_many :posts_tags
has_many :posts, :through => :posts_tags
# has_and_belongs_to_many :posts, :through => :posts_tags
end
当我搜索帖子的标签或标签的帖子时,此配置不会给我错误,但是当我执行 @tag = Tag.find_by_id(1) @tag.destroy 时,“posts_tags”表仍保留所有内容tag_id == 1 行仍然存在。当我试图破坏它们时,我得到了错误(我认为这是因为这也会破坏关联)。
有人知道怎么解决吗?可以简单地一起删除 PostsTag 模型吗?
Activerecord 文档使用了一个示例,其中连接表是一个单词,所以我无法在那里找到答案。
我看到有些人根本没有为连接表制作模型。当我删除我的连接表模型时,出现了这个错误:
@post = Post.find_by_id(1)
@post.tags.each do |tag|
p tag.name
end
NameError at / uninitialized constant Tag::PostsTag
感谢您的帮助!
#第二阶段问题:
在我可以尝试将这段代码添加到我的模型中的提示之后:
class Post < ActiveRecord::Base
has_many :posts_tags, dependent: :destroy
class Tag < ActiveRecord::Base
我在我的服务器/应用程序文件中运行它:
delete "/tag/destroy" do
body = JSON.parse request.body.read # body: {id: number} or {name: string}
@tag_to_destroy = Tag.where(body)[0]
@tag_to_destroy.destroy
redirect "/tag"
end
我通过 postman 发送这个请求:
http://localhost:4567/tag/destroy
body of request:
{
"id": 12
}
我收到这个错误: (即使在 posts_tags 数据库中 有 tag_id = 12,post_id = variousNumbers 的行):
== Sinatra (v2.0.1) 在 Puma 的支持下在 4567 上进行开发Puma 以单人模式开始...* 版本 3.11.4 (ruby 2.5.1-p57),代号:Love Song* 最小线程数:0,最大线程数:16*环境:开发*监听tcp://localhost:4567使用 Ctrl-C 停止D, [2018-05-07T10:54:19.604906 #99099] DEBUG -- : 标签加载 (0.5ms) SELECT "tags".* FROM "tags"WHERE "tags"."id"= $1 [["id", 12]]D、[2018-05-07T10:54:19.617955 #99099] 调试——:(0.3 毫秒)开始D, [2018-05-07T10:54:19.633736 #99099] DEBUG -- : PostsTag Load (1.5ms) SELECT "posts_tags".* FROM "posts_tags"WHERE "posts_tags"."tag_id"= $1 [["tag_id", 12]]D, [2018-05-07T10:54:19.642305 #99099] DEBUG -- : PostsTag Destroy (1.6ms) DELETE FROM "posts_tags"WHERE "posts_tags".""IS NULLD, [2018-05-07T10:54:19.642685 #99099] DEBUG -- : (0.2ms) ROLLBACK2018-05-07 10:54:19 - ActiveRecord::StatementInvalid - PG::SyntaxError: 错误:“”“”处或附近的零长度分隔标识符第 1 行:从“posts_tags”中删除“posts_tags”。“”为空 ^:从“posts_tags”中删除“posts_tags”。“”为空: /Users/maiya/.rvm/gems/ruby-2.5.1/gems/activerecord-5.2.0/lib/active_record/connection_adapters/postgresql_adapter.rb:603:in `async_exec'
问题更新:
join-table 迁移之前是:
create_table :posts_tags :id => false do |t|
t.belongs_to :tag, index: true
# comment: the above line creates: t.integer :post_id
t.belongs_to :post, index: true
# comment: the above line creates: t.integer :tag_id
end
最佳答案
现在您的迁移和模型一切正常,您只需要更改 Post
和 Tag
型号:
has_many :posts_tags
到
has_many :posts_tags, dependent: :destroy
在这种情况下,在您销毁任何标签或发布所有关联的 posts_tags 后也被销毁,它将确保您的应用程序的引用完整性并防止错误。
此外,回滚迁移是个好主意,添加 foreign_key: true
t.belongs_to
的选项行,然后再次迁移它。此选项将提供数据库级别的参照完整性。
更新:
has_and_belongs_to_many
(HABTM) 不适用于 through
选项,你把它和 has_many
混在一起了协会。请在 guides 中阅读更多信息
要使其全部正常工作,您需要:
:id => false
CreatePostsTagsTable 迁移选项has_and_belongs_to_many <...>, :through => :posts_tags
至 has_many <...>, :through => :posts_tags
在 Tag 和 Post 模型中附言按照惯例,ruby 中的所有文件名都是小写蛇形,它应该是 `posts_tag.rb',而不是 'Posts_Tag.rb'
关于ruby-on-rails - 连接表有两个复数词。如何正确命名模型和迁移;为了销毁连接表上的孤儿。事件记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50205593/
我四处寻找是否有任何合适的方法来处理 CSS3 多列中的寡妇和孤儿,但很失望地发现没有。我自己尝试了 widow 和 orphan 属性,但它们什么也没做。 有人知道使用 CSS3 多列并处理寡妇和孤
从 Blobstore 中删除孤立 blob 的最有效方法是什么? 应用功能和范围: 一个(已登录)用户想要创建一个包含一些常规内容的帖子数据存储区字段(例如姓名、姓氏、评论)和 blob(图像)。
从 Blobstore 中删除孤立 blob 的最有效方法是什么? 应用功能和范围: 一个(已登录)用户想要创建一个包含一些常规内容的帖子数据存储区字段(例如姓名、姓氏、评论)和 blob(图像)。
我可以使用哪种级联类型以及在何处让 Hibernate 在不再有“事物”引用图像时自动删除该图像? (基本上就是 Hibernate 中的垃圾收集) 数据库:事物表-图像表,是多对一的,所以很多事物可
我是一名优秀的程序员,十分优秀!