我有用户.用户可以戳戳其他用户,也可以戳自己.每个戳都是方向性的,并且不存在组戳.我想列出给定用户的所有戳(传入或传出),而不重复自我戳(作为incoming_和outgoing_pokes存在).
这是我的模特:
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
Run Code Online (Sandbox Code Playgroud)
我尝试在User模型中创建一个合并戳的方法:
def all_pokes
outgoing_pokes.merge(incoming_pokes)
end
Run Code Online (Sandbox Code Playgroud)
但是它只返回自我戳(那些是incoming_和outgoing_pokes).想法?是否有一种干净的方法直接使用关联?
此外,在合并列表中,每个poke都有两个布尔值可以记录它们与当前用户的关系.像outgoing和的东西incoming.
cor*_*ard 11
你的all_pokes方法只返回self-pokes的原因是因为outgoing_pokes它不是一个数组,而是一个你可以链接的AR关系.merge在这种情况下,在执行查询之前组合查询.
你想要的是实际执行查询并合并结果集:
def all_pokes
(outgoing_pokes.all + incoming_pokes.all).uniq
end
Run Code Online (Sandbox Code Playgroud)
...或者您可以编写自己的查询:
def all_pokes
Poke.where('poker_id = ? OR pokee_id = ?', id, id)
end
Run Code Online (Sandbox Code Playgroud)
# 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
Run Code Online (Sandbox Code Playgroud)
现在,Rails 5具有 OR查询了,这是一个非常易读的解决方案。
def pokes
outgoing_pokes.or(incoming_pokes)
end
Run Code Online (Sandbox Code Playgroud)
我all在方法名称中省略了,因为它现在返回了ActiveRelation并且可以链接其他方法。
@user.pokes.where(...).includes(...)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7507 次 |
| 最近记录: |