Я считаю, что что-то вроде следующего должно сделать это для вас:
named_scope :public_workouts,
:joins => ", user, membership"
:conditions =>
"workouts.public = 1 or
membership.box_id = #{current_user.membership.box_id}",
:group => "workouts.id",
:order => "workouts.created_at DESC"
Тебе придется немного поиграть с этим. Сложная часть каждый раз, когда я пытаюсь сделать что-то подобное, - это исправить условия ИЛИ. Вы хотите, чтобы все общедоступные и те, где совпадает присоединяемый members.box_id, независимо от общедоступного значения 1.
Редактировать: По общему признанию, это, возможно, не самый рубиновый способ построения запроса, и я не проверял его должным образом, но что-то вроде ниже также может быть выполнено для работы.
def self.public_workouts
query = Workout.joins(:user => { :membership })
if current_user
query.where('memberships.box_id = ? or workouts.public = 1', current_user.membership.box_id) unless current_user.membership.box_id.nil?
else
query.where('workouts.public = 1')
end
query.group('workouts.id')
query.order("workouts.created_at DESC")
return query
end
Edit2
Другой альтернативой может быть создание двух отдельных областей и создание метода класса, который объединяет две области. Этот метод класса будет затем использоваться в представлении.
named_scope :box_workouts,
:joins => ", user, membership"
:conditions => "memberships.box_id = #{current_user.membership.box_id}"
:group => "workouts.id",
:order => "workouts.created_at DESC",
:select "workouts"
named_scope :public_workouts,
:conditions => :public => 1
:order => "workouts.created_at DESC"
def self.public_box_workouts
return box_workouts.merge(public_workouts).limit(3) if current_user
return public_workouts.limit(3)
end
Edit3 Не так сложно, я думаю, что-то вроде ниже будет работать.
def self.box_and_public_workouts(user)
return public_workouts if user.nil? or user.memberships.blank?
return public_workouts + box_workouts(user.memberships.map(&:box_id))
end
named_scope :box_workouts, lambda { |box_ids| { :conditions => ['box_id IN (?)', box_ids], :order => 'created_at DESC' } }
Извините за то, что так долго. Я скучал, путаясь с тем, как «старый» способ запроса базы данных. Я пошел прямо для Rails3:)
Во всяком случае, я не хотел ничего совершать, поэтому я попытался раскошелиться, чтобы отправить запрос на извлечение, но github мне сегодня грубоват. Тогда просто скопируйте отсюда.