我正在尝试跟踪互相喜欢的情况,即用户喜欢一个也喜欢他们的用户。为了检查喜欢是否互相,我会在创建喜欢后调用一个方法。如果那个点赞者曾经被点赞过,那么就被认为是互相的喜欢。
然而,问题在于我遇到了一些奇怪的错误,我相信这与外键的设置有关。我在Rails中设置了has_many关联,但每当我尝试访问它时,我会收到一个“PG::InFailedSqlTransaction: ERROR: current transaction is aborted, commands ignored until end of transaction block : RELEASE SAVEPOINT active_record_1”错误。 用户:
然而,问题在于我遇到了一些奇怪的错误,我相信这与外键的设置有关。我在Rails中设置了has_many关联,但每当我尝试访问它时,我会收到一个“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
我已经尝试将钩子设置在保存等位置,但也不起作用。
此外,如果我调用Like.first
,也会出现同样的错误。
我尝试打印liker.likes.where(likee: liker)
,结果显示PG::UndefinedColumn: ERROR: column likes.user_id does not exist
,我认为这就是问题所在。
然而,在钩子内部,我可以访问self.likee
,但如果调用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.user.likes
能用吗? - Kelsey Hannanself.likee.likes
,我会得到一个#< Like :: ActiveRecord_Associations_CollectionProxy: 0x3feaa56865bc>
,它无法转换为普通的模型实例/数组。 - user3162553