Модель фильтрующих рельсов с неизвестными данными - PullRequest
0 голосов
/ 16 октября 2011

Я собираю список открытых корзин для конкретного пользователя со следующим кодом.

@open_buckets = Buckets.order("buckets.id ASC").where(:user_id => @user.id)

Существует также концепция личных корзин для пользователя.Я хочу, чтобы приватные сегменты возвращались только в том случае, если зарегистрированный пользователь является владельцем группы.Частное поле является логическим.Могу ли я как-то изменить свой запрос, чтобы все пользователи получали публичные сегменты, а только владельцы - свои частные и публичные сегменты?

Единственное, о чем я подумал, - это проверить, был ли вошедший в систему пользователь таким же, как пользователь, чьи сегменты запрашиваются, и выполнить другой запрос.Нечто вроде ниже.

if :session["user_id"] => :user_id
    @open_buckets = Buckets.order("buckets.id ASC").where(:user_id => @user_id)
else
    @open_buckets = Buckets.order("buckets.id ASC").where(:user_id => @user_id).where(:private => true)

Спасибо

Ответы [ 2 ]

2 голосов
/ 16 октября 2011

Ну, хотя я не согласен с использованием одного представления (или одного списка / частичного, более конкретно) для отображения двух разных типов информации, вот способ, которым вы можете сделать то, что вы ищете:

@buckets = Buckets.order("buckets.id ASC").where(:user_id => @user_id, :private => false)
@buckets += @buckets.where(:private => true) if current_user.id == user.id

Вы также можете создать несколько интересных областей для обработки этой полусложной логики в модели, где она должна быть, а также использовать ваши ассоциации более полно:

@user = User.find(params[:user_id])
@buckets = @user.buckets.public
@buckets += @user.buckets.private if @current_user == @user
respond_with @buckets = @buckets.order("buckets.id asc")

и модель Buckets:

scope :public, where(:private => false)
scope :private, where(:private => true)

В качестве примечания, имена классов моделей всегда должны быть единственными. В вашем примере Buckets, поэтому, если это не опечатка, я рекомендую вернуться и изменить ее, если это целесообразно. Это приведет к путанице в будущем, особенно для будущих разработчиков вашего приложения.

0 голосов
/ 16 октября 2011

A named_scope (или просто scope в Rails 3 ) может это сделать.

class Bucket
  ...

  named_scope :visible_buckets_for, lambda {|user| { :conditions=>["private = 'f' OR (private = 't' and user_id = ?)", current_user.id], :order=>"buckets.id ASC" } }

Где 'current_user' - это любой метод, который вы должны получить id текущего пользователя, вошедшего в систему, и 't' является специфичным для БД представлением значения true.Некоторые БД используют «true» или любое ненулевое число.

Затем вы называете его следующим образом:

 > Bucket.visible_buckets_for(current_user)
=> [<#Bucket1>, <#Bucket2>, <#Bucket3> ... ]

... который представляет собой массив Bucket объектов, отсортированных поid.

Вы можете передать любого пользователя в эту именованную область, в случае, если вам нужно выяснить это не только для текущего пользователя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...