gpt4 book ai didi

ruby-on-rails - 我如何区分是 'first' 还是 'created' 与 first_or_create

转载 作者:太空宇宙 更新时间:2023-11-03 17:38:23 26 4
gpt4 key购买 nike

我正在尝试使用这个语句:

@vote = Vote.where(:resource_id => params[:id], :user_id => current_user.id).first_or_create(:value => 1)

这是为了赞成票或反对票。如果该行在数据库中不存在,它应该创建它(如果他们从未对该帖子投票),否则它应该用 -1,0,1 修改值。

如果他们第二次点击赞成票,则需要“撤消”投票并将行“值”置于 0 而不是 1。反对票也会发生同样的情况,但这只是现在的赞成票功能。

尽管在 Rails 中调试此语句时遇到问题。我需要基本上区分它是保存的记录还是创建的记录。如果我把:

@vote = Vote.where(:resource_id => 25, :user_id => 1)
@vote.exists?

我得到 true

但是如果我把这个..(并且记录确实存在,它只是在上面工作)..

@vote = Vote.where(:resource_id => 25, :user_id => 1).first_or_create(:value => 1)
@vote.exists?

我明白了...NoMethodError:未定义的方法“存在?”对于 #

查看这两个对象的类后,我看到一个是“投票”,一个是“ActiveRecord::Relation”。

我的最终目标是以某种方式重构它(主要是检查投票值是否已经为 1 的部分,如果是则将其设置为零(撤消投票)否则将其设置为 1

这是我开始尝试使用 first_or_create 进行重构之前的代码。它又长又丑。

 if @vote.exists?
# Check if they have already voted
if @vote.first.value == 1
@vote.first.value = 0
else
@vote.first.value = 1
end
flash[:notice] = "previous vote modified"
@vote.first.save
else
# Create a new Vote instance, save it
@vote = Vote.new(:resource_id => params[:id], :user_id => current_user.id, :value => 1)
if @vote.valid?
@vote.save
flash[:notice] = "New vote added"
else
@vote.save
flash[:notice] = (@vote.errors.full_messages).to_s
end
end

最佳答案

我会改用 Rails 魔术方法 find_or_create_by 方法。

在此处查看“基于动态属性的查找器”:

http://api.rubyonrails.org/classes/ActiveRecord/Base.html

您可以像动态查找方法一样使用它,但如果它不存在,则传入您要添加的额外变量以创建投票。

在你的情况下,它会是这样的:

@vote = Vote.find_or_create_by_resource_id_and_user_id(25, 1, :value => 1)

如果您不希望它立即创建,您可以使用 find_or_initialize_by,它实际上创建了一个 Vote.new 而不保存。

关于ruby-on-rails - 我如何区分是 'first' 还是 'created' 与 first_or_create,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10537998/

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