我有一个方法,之前是这样的
def circles
Circle.in(id: memberships.pluck(:circle_id))
end
加了一个参数,做了个判断,就平白多了很多行,请问有没有更简洁的写法,谢啦先!
def circles(status)
local_memberships = memberships
if (status)
local_memberships = local_memberships.where(status: status)
end
Circle.in(id: local_memberships.pluck(:circle_id))
end
Circle.in(id: (status.nil? ? memberships : memberships.where(status: status)).pluck(:circle_id))
然而不见得比你写的读起来清楚
不能再简单了吧... 最多挤成一行但逻辑并没有简化
另外,可以用 nested select 减少一个查询?
Circle.in id: (status ? memberships.where(status: status) : memberships).select(:circle_id)
class User
has_many :memberships
has_many :circles, through: :memberships do
# Association Extensions
def status(status)
where(memberships: { status: status })
end
end
end
class Membership
belongs_to :user
belongs_to :circles
end
class Circle
has_many :memberships
has_many :users, through: :memberships
end
# Association
User.first.circles.where(memberships: { status: status})
# Association Extensions
User.first.circles.status(status)
#7 楼 @blacktulip ?!
与 if-else 的要求应该是一样的。
只要能转换成 true / false 的都可以。
(Ruby 里应该所有的东西都能转布尔吧)