2016-04-07 2 views
2

Я хочу, чтобы реорганизовать этот код:Refactor рубин код, основанный на админа присутствует или нет

def self.find_posts(page, per_page, author_id, user) 
    if user.admin? 
    paginate(page: page, per_page: per_page) #fetches on the basis of per_page 
    else 
    paginate(page: page, per_page: per_page).where(author: author_id) #Based on author_id 
    end 
end 

Post.paginate(page: page, per_page: per_page) повторяется два раза, так что я хотел, чтобы удалить его.

Вот что я пробовал:

def self.find_posts(page, per_page, author_id, user) 
    paginate(page: page, per_page: per_page) #fetches the no of per_page 
    if user.admin? 
    #not getting what should I write here 
    else 
    where(author: author_id) #Based on author_id 
    end 
end 

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

+1

Добро пожаловать в переполнение стека. Пожалуйста, не просите о помощи. Переполнение стека существует, чтобы помочь людям. Поблагодарить нас тоже не нужно, так как SO не является дискуссионным форумом, это скорее справочник, в котором вы помогаете писать статьи об устранении определенных проблем программирования. –

ответ

0

Я не уверен, что его необходимо реорганизовать. Но только, чтобы дать вам варианты:

Вы можете сделать это (или до создания хэш)

paginate(page: page, per_page: per_page).where(user.admin? ? {} : {author: author_id}) 

или добавить объем по умолчанию на свой пост

+1

или '(user.admin?? All: where (author: author_id)). Paginate (страница: страница)' – jazzytomato

+0

Хороший подход, но обзор не очень полезен для меня, так как мне больше не нужно его использовать –

+0

Ternary оператор как параметр метода, где он просто нечитабельно и уродлив. – Sebastian

1

Я бы написать:

def self.find_posts(page, per_page, author_id, user) 
    posts = user.admin? ? Post.all : Post.where(author: author_id) 
    posts.paginate(page: page, per_page: per_page) 
end 
+0

О, хорошо. Очень хороший ответ. Большое спасибо –

+0

Также не имеет в виду, что в методе класса ActiveRecord можно привязать цепи с помощью областей. Это вместе с областями от драгоценного камня pudit (авторизация доступа) может дать вам действительно чистое решение. Посмотрите https://github.com/elabs/pundit#scopes – Sebastian

+0

tokland: У меня есть сомнения здесь. Он будет получать здесь все сообщения, а затем он будет разбивать на страницы, что нужно избегать. Я вообще не хочу брать все записи за раз. –