Hej, mam taki kod:
if for_user?
Order.where(user_id: user.id)
else
Order
end.sum('amount')
Moje pytania:
- Czy jest lepszy sposób na chainowanie AR::Relation (w tym przypadku) niż if?
- Wydaje mi się, że wywoływanie metody na if … end jest popularne, ale czy czytelne dla Was?
Ad 2). Dla mnie bardziej byłoby
@order = for_user? ? Order.where(...) : Order
@sum = @order.sum(:amount)
Trenary operator powoduje, że kod jest bardziej nieczytelny, więc pozostaje if.
sevos
4
class Order < #....
scope :for_user, ->(user) {
if user
where(user_id: user.id)
else
scoped
end
}
end
a w ogóle to czemu nie User.has_many :orders?
drogus
5
Ja takie rzeczy piszę w takiej formie czasami:
[code]@order = Order.scoped
@order = @order.where(user_id: user.id) if for_user?
@sum = @order.sum(‘amount’)[/code]
Wtedy można łatwo dodać kolejne rzeczy.
@sevos Przykład był wymyślony na szybko, logika kodu jest trochę inna. Ale odpowiedzi mi pomogły, dzięki!