Подпишитесь на рассылку о самых интересных материалах в мире веб-разработки :)

Вывод статей с published=1


(Виктор) #21

Не работает как? Не выводит вообще статьи?


(МАКСИМ МАЙОРОВ) #22

Выводит статьи как надо posts_controller, его можно пока не трогать. Мне надо что бы tags_controller не выводил статью, если published=0.


(Виктор) #23

При @posts = @tag.posts.published он выводит?


(МАКСИМ МАЙОРОВ) #24

published я дописал, но это ничего не меняет в выводе( выводятся все статьи, включая те, что выводить не надо), хотя и не вызывает ошибки.


(Виктор) #25

Не проверял, может так оно и не работает.
Ну тогда…
@posts = @tag.posts.where(published: 1)
Чего делать-то.
И тот кусок, что выше я рисовал, (Вывод статей с published=1) в контроллер поста.
Хотя, в итоге все равно придется ставить pundit или cancancan.


(Kvokka) #26

есть scope для того, чтобы DRYить модели и не повторять одно и то же
ожидайте в следующей серии NoMethodError: undefined method 'posts' for nil:NilClass :wink:


(Виктор) #27

Про scope было в прошлой серии же.

Ясно дело, что со scope (соскоб) более правильно.
Максим говорит, что @posts = @tag.posts.published не работает, хотя – должно, как по мне.
Предложил вот альтернативный путь (костыль).


(Kvokka) #28

я вообще не понял всей это переписки.
ведь можно же кинуться логом ошибки, если "сложна, сложна"
а так получается уже даже не смешно.
это как на адронном коллайдере неисправность “не включается” чинить. хотя, может это и к лучшему, что не включается :wink:


(Виктор) #29

Да нету ошибки.

В модели Post

scope :published, -> { where published: 1 }

В контроллере TagContoller

@posts = @tag.posts.published

В итоге, в @posts, со слов топикстартера, есть посты у которых published 0.

Ну, не знаю.


(МАКСИМ МАЙОРОВ) #30

Всё именно так и сделано, но published=0 в выводе есть.

А это зачем? Есть Devise


(МАКСИМ МАЙОРОВ) #31
Started GET "/posts" for 127.0.0.1 at 2018-02-02 12:12:45 +0300
Processing by PostsController#index as HTML
  Rendering posts/index.html.erb within layouts/application
  Post Load (1.0ms)  SELECT `posts`.* FROM `posts` WHERE `posts`.`published` = 1
  Tag Load (0.7ms)  SELECT `tags`.* FROM `tags` INNER JOIN `taggings` ON `tags`.`id` = `taggings`.`tag_id` WHERE `taggings`.`post_id` = 17
  Tag Load (0.7ms)  SELECT `tags`.* FROM `tags` INNER JOIN `taggings` ON `tags`.`id` = `taggings`.`tag_id` WHERE `taggings`.`post_id` = 18
  Tag Load (0.5ms)  SELECT `tags`.* FROM `tags` INNER JOIN `taggings` ON `tags`.`id` = `taggings`.`tag_id` WHERE `taggings`.`post_id` = 27
  Tag Load (0.5ms)  SELECT `tags`.* FROM `tags` INNER JOIN `taggings` ON `tags`.`id` = `taggings`.`tag_id` WHERE `taggings`.`post_id` = 28
  Tag Load (0.4ms)  SELECT `tags`.* FROM `tags` INNER JOIN `taggings` ON `tags`.`id` = `taggings`.`tag_id` WHERE `taggings`.`post_id` = 30
  Tag Load (0.6ms)  SELECT `tags`.* FROM `tags` INNER JOIN `taggings` ON `tags`.`id` = `taggings`.`tag_id` WHERE `taggings`.`post_id` = 31
  Tag Load (0.6ms)  SELECT `tags`.* FROM `tags` INNER JOIN `taggings` ON `tags`.`id` = `taggings`.`tag_id` WHERE `taggings`.`post_id` = 32
  Tag Load (0.5ms)  SELECT `tags`.* FROM `tags` INNER JOIN `taggings` ON `tags`.`id` = `taggings`.`tag_id` WHERE `taggings`.`post_id` = 33
  Tag Load (0.4ms)  SELECT `tags`.* FROM `tags` INNER JOIN `taggings` ON `tags`.`id` = `taggings`.`tag_id` WHERE `taggings`.`post_id` = 35
  Rendered posts/index.html.erb within layouts/application (41.4ms)
  Tag Load (0.4ms)  SELECT name, count(taggings.tag_id) as count  FROM `tags` INNER JOIN `taggings` ON `taggings`.`tag_id` = `tags`.`id` GROUP BY taggings.tag_id
Completed 200 OK in 108ms (Views: 97.0ms | ActiveRecord: 6.3ms)

Это запрос всех постов. Там видно, что ищет с published=1

Started GET "/tags/ruby" for 127.0.0.1 at 2018-02-02 12:12:47 +0300
Processing by TagsController#show as HTML
  Parameters: {"id"=>"ruby"}
  Tag Load (0.2ms)  SELECT  `tags`.* FROM `tags` WHERE `tags`.`name` = 'ruby' LIMIT 1
  Rendering tags/show.html.erb within layouts/application
  Post Exists (0.4ms)  SELECT  1 AS one FROM `posts` INNER JOIN `taggings` ON `posts`.`id` = `taggings`.`post_id` WHERE `taggings`.`tag_id` = 1 LIMIT 1
  Post Load (0.4ms)  SELECT `posts`.* FROM `posts` INNER JOIN `taggings` ON `posts`.`id` = `taggings`.`post_id` WHERE `taggings`.`tag_id` = 1
  Tag Load (0.3ms)  SELECT `tags`.* FROM `tags` INNER JOIN `taggings` ON `tags`.`id` = `taggings`.`tag_id` WHERE `taggings`.`post_id` = 30
  Tag Load (0.3ms)  SELECT `tags`.* FROM `tags` INNER JOIN `taggings` ON `tags`.`id` = `taggings`.`tag_id` WHERE `taggings`.`post_id` = 16
  Tag Load (0.4ms)  SELECT `tags`.* FROM `tags` INNER JOIN `taggings` ON `tags`.`id` = `taggings`.`tag_id` WHERE `taggings`.`post_id` = 18
  Tag Load (0.4ms)  SELECT `tags`.* FROM `tags` INNER JOIN `taggings` ON `tags`.`id` = `taggings`.`tag_id` WHERE `taggings`.`post_id` = 27
  Tag Load (0.4ms)  SELECT `tags`.* FROM `tags` INNER JOIN `taggings` ON `tags`.`id` = `taggings`.`tag_id` WHERE `taggings`.`post_id` = 28
  Tag Load (0.4ms)  SELECT `tags`.* FROM `tags` INNER JOIN `taggings` ON `tags`.`id` = `taggings`.`tag_id` WHERE `taggings`.`post_id` = 29
  Tag Load (0.4ms)  SELECT `tags`.* FROM `tags` INNER JOIN `taggings` ON `tags`.`id` = `taggings`.`tag_id` WHERE `taggings`.`post_id` = 35
  Tag Load (0.3ms)  SELECT `tags`.* FROM `tags` INNER JOIN `taggings` ON `tags`.`id` = `taggings`.`tag_id` WHERE `taggings`.`post_id` = 34
  Tag Load (0.4ms)  SELECT `tags`.* FROM `tags` INNER JOIN `taggings` ON `tags`.`id` = `taggings`.`tag_id` WHERE `taggings`.`post_id` = 36
  Rendered tags/show.html.erb within layouts/application (24.0ms)
  Tag Load (0.4ms)  SELECT name, count(taggings.tag_id) as count  FROM `tags` INNER JOIN `taggings` ON `taggings`.`tag_id` = `tags`.`id` GROUP BY taggings.tag_id
Completed 200 OK in 82ms (Views: 75.3ms | ActiveRecord: 4.7ms)

А этот из tags_controller


(МАКСИМ МАЙОРОВ) #32

Я понял, в чём дело.

Эта строчка работает, если теги у статьи удалить. Немного не то что надо, но меня устраивает. Всем спасибо за участие.


(Kvokka) #33

а теперь самое время познать проблему N+1 и протчая includes