Задать вопрос
AdilA
@AdilA
Нравится кодить, изучаю go c echo

Как исключить определенные записи в запросе?

Всем доброго времени суток!
Есть Посты, у постов есть отзывы, вот нужно эти самые отзывы показывать у юзеров на страницах, все работает, но хотелось бы исключить отзыв если его написал тот юзер у кого он отобржается как это сделать?
Post.rb
has_many :reviews
belongs_to :executor, class_name: 'User', :foreign_key => 'executor_id'
end

Review.rb
belongs_to :post
  belongs_to :user
end

class CreateReviews < ActiveRecord::Migration
  def change
    create_table :reviews do |t|
      t.text :body
      t.references :post, index: true
      t.references :user, index: true

      t.timestamps
    end
  end
end

во вьюхе вставляю
<% @user.executors.includes(:reviews).each do |post| %>
    <% post.reviews.each do |review| %>
          <%= avatar_for review.user, :size => "50x50" %>
        <%= link_to review.user.name, review.user %>
        отзыв о выполнении задания: <%= link_to post.name, post %>  
          <%= review.body %>
    <% end %>
  <% end %>

Сейчас все работает, но на страничке на которой отображается отзыв, присутствует отзыв юзера который писал этот самый юзер, а его там не должно быть, там должен быть только отзывы от других юзеров, подскажите как сделать? как прописать исключение то есть исключить юзера но оставить другие отзывы, или может сделать другую схему?
  • Вопрос задан
  • 2418 просмотров
Подписаться 4 Оценить 2 комментария
Пригласить эксперта
Ответы на вопрос 1
estum
@estum
Во-первых, как обычно всем советую гем squeel.

В review.rb:
scope :for_posts_of, ->(_author){
  where{
    (post_id >> _author.posts.select{id}) & 
    (user_id != _author.id)
  }
}


Выходит запрос вроде:
SELECT "reviews".* FROM "reviews"
WHERE ((
  "reviews"."post_id" IN (SELECT "posts"."id" FROM "posts" WHERE "posts"."user_id" = 1)
  AND "reviews"."user_id" != 1
))


В контроллере теперь можно:
def show
  @user = User.find(params[:id])
  @reviews = Review.for_posts_of @user 
end
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы