gpt4 book ai didi

ruby-on-rails - 使用 Postgres 在 Rails 中设置外键

转载 作者:数据小太阳 更新时间:2023-10-29 07:18:17 25 4
gpt4 key购买 nike

我正在尝试跟踪用户喜欢的用户喜欢他们的相互喜欢的情况。为了检查 like 是否相互,我在创建 like 后调用了一个方法。如果那个喜欢的人是一个喜欢的人,那么它就被认为是相互的。

然而,问题是我遇到了一些奇怪的错误,我认为这些错误与外键的设置方式有关。我已经在 Rails 中建立了一个 has many association,但是每当我尝试访问它时,我都会得到一个 PG::InFailedSqlTransaction: ERROR: current transaction is aborted, commands ignored until end of transaction block
: RELEASE SAVEPOINT active_record_1
错误。

用户:

class User < ApplicationRecord
has_many :likes
end

喜欢:

class Like < ApplicationRecord
belongs_to :likee, class_name: 'User', foreign_key: 'likee_id'
belongs_to :liker, class_name: 'User', foreign_key: 'liker_id'
belongs_to :connection, optional: true

after_save :mutual_like?

private

def mutual_like?

if liker.likes.where(likee: liker)
# fails
end
end
end

我已经尝试将钩子(Hook)更改为围绕保存等,但这也不起作用。

此外,我什至无法调用 Like.first否则我会得到同样的错误。

我试过打印出 liker.likes.where(likee: liker)我得到 PG::UndefinedColumn: ERROR: column likes.user_id does not exist我认为这是问题所在。

但是我可以像这样访问喜欢者:self.likee在 Hook 内,但我无法调用 self.likee.likes没有返回 #<Like::ActiveRecord_Associations_CollectionProxy:0x3fd91ca5ca78>

架构:

  create_table "likes", force: :cascade do |t|
t.integer "liker_id", null: false
t.integer "likee_id", null: false
t.integer "connection_id"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.index ["likee_id"], name: "index_likes_on_likee_id", using: :btree
t.index ["liker_id"], name: "index_likes_on_liker_id", using: :btree
end





create_table "users", force: :cascade do |t|
t.string "email"
t.string "username"
t.string "password_digest"
t.boolean "admin", default: false
t.index ["email"], name: "index_users_on_email", using: :btree
t.index ["username"], name: "index_users_on_username", using: :btree
end

测试:

RSpec.describe Like, type: :model do
let(:liker) { Fabricate(:user) }
let(:likee) { Fabricate(:user) }
let(:like) { Fabricate(:like, liker: liker, likee: likee) }
let(:pending_like) { Fabricate.build(:like, liker: liker, likee: likee)}

context 'relations' do
it { should belong_to :likee }
it { should belong_to :liker }

describe 'liking another user' do

it '#liker references first user' do
expect(like.likee).to eq likee
end

it '#likee references second user' do
expect(like.liker).to eq liker
end

end
end
...

RSpec.describe User, type: :model do
context 'relations' do
it { should have_many :likes }
end
...

这是因为我正在尝试查找正在保存的记录吗?

最佳答案

liker.likes.where(likee: liker) 只返回一个关系。您必须像这样执行查询 liker.likes.where(likee: liker).exists?

has_many :likes 在您的 User 模型中需要一个列 user_id 在您的表 likes 中。使用给出的代码,我认为您必须将其更改为

class User < ApplicationRecord
has_many :other_likes, foreign_key: :liker_id
has_many :likes, foreign_key: :likee_id
end

belongs_to :connection 在我看来是个坏名字。 ActiveRecord::Base 有一个同名的类方法。也许有一天您会遇到此类关联名称的问题。

关于ruby-on-rails - 使用 Postgres 在 Rails 中设置外键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39928841/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com