gpt4 book ai didi

ruby-on-rails - 合并来自同一模型的两个 has_many 关联的结果

转载 作者:行者123 更新时间:2023-12-03 03:19:41 28 4
gpt4 key购买 nike

我有用户。用户可以戳其他用户,也可以戳自己。每个戳都是定向的,并且不存在组戳。我想列出给定用户的所有 poke(传入或传出),而不重复 self-poke(以传入_和传出_poke 形式存在)。

这是我的模型:

class User < ActiveRecord::Base
has_many :outgoing_pokes, :class_name => "Poke", :foreign_key => :poker_id
has_many :incoming_pokes, :class_name => "Poke", :foreign_key => :pokee_id
end

class Poke < ActiveRecord::Base
belongs_to :poker, :class_name => "User"
belongs_to :pokee, :class_name => "User"
end

我尝试在 User 模型中创建一个方法来合并 Poke:

def all_pokes
outgoing_pokes.merge(incoming_pokes)
end

但这只返回自戳(那些既是传入_戳又是传出_戳)。有想法吗?有没有一种干净的方法可以直接使用关联来做到这一点?

此外,在合并列表中,如果每个 poke 都有两个 bool 值来记录它们与当前用户的关系,那就太好了。类似于传出传入

最佳答案

您的 all_pokes 方法仅返回 self-pokes 的原因是 outgoing_pokes 还不是数组,而是您可以链接的 AR 关系。在本例中,merge 在执行查询之前合并查询。

您想要的是实际执行查询并合并结果集:

def all_pokes
(outgoing_pokes.all + incoming_pokes.all).uniq
end

...或者您可以编写自己的查询:

def all_pokes
Poke.where('poker_id = ? OR pokee_id = ?', id, id)
end

确定是传入还是传出:

# in poke.rb
def relation_to_user(user)
if poker_id == user.id
poker_id == pokee_id ? :self : :poker
elsif pokee_id == user.id
:pokee
else
:none
end
end

关于ruby-on-rails - 合并来自同一模型的两个 has_many 关联的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11486027/

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