
Roman
16.03.2018
19:56:29
методы в AR, типа where, find тоже методы класса. Если тебе нужно совершить какое-то действие с несколькими объектами, то можно использовать метод класса

Alex
16.03.2018
19:57:01
это понятно)
просто я литературу почитал и у меня как-то не созрел в голове кейс на практическое применение, только кейс на тему что это

Roman
16.03.2018
19:58:25
или ты пишешь какой-нибудь апи клиент, который делает запросы на другой сервер, то это можно упаковать в виде методов класса типа Api.get_something

Google

Alexander
16.03.2018
19:59:40
форум Ромы жив?

Alex
16.03.2018
20:00:09
" Если тебе нужно совершить какое-то действие с несколькими объектами, то можно использовать метод класса" а можно пример?

Vladimir
16.03.2018
20:01:54
форум Ромы жив?
жив только Рома, жив ГитХаб, живы Видосы с курса. А... ещё и #Ruby жив!

Roman
16.03.2018
20:01:59
ну в той же рельсе можно упаковать в модель какой-нибудь метод с нотификацией всех юзеров (хотя это не очень хорошо) типа User.notify_all

Alex
16.03.2018
20:02:52
наверно я пока не готов это понять
т.е. я создаю метод класса, который добавляет нужный метод к объекту?

Roman
16.03.2018
20:05:05
нет, зачем, это такой же метод, как для обычного объекта

Alex
16.03.2018
20:05:18
тогда я не понимаю в чем прикол
я не понял саму фразу ''упаковать в модель метод"

Roman
16.03.2018
20:06:45
если копнуть глубже, то по факту методы класса - это синглтон методы, которые принадлежат одному объекту класса, так как в руби все - объект

Alex
16.03.2018
20:07:41
метод класса добовляет метод к классу User
А некрасиво это, потому что фиг отследишь

Google

Roman
16.03.2018
20:09:01
это будет что-то типа
def self.notify_all
User.all.pluck(:email).each {|email| UserMailer.email(email).deliver_later}
end

Alex
16.03.2018
20:10:20
выходит применив этот метод я разошлю почту всем объектам класса user?
про синглтон методы я ещё ничего не знаю к сожалению

Roman
16.03.2018
20:10:55
ну не объектам, достанешь из бд все адреса и разошлешь

Alex
16.03.2018
20:11:10
ну да, это и имелось ввиду
почему это не очень хорошо?

Roman
16.03.2018
20:12:36
потому что лишняя логика в модели, а это не соответствует solid

Alex
16.03.2018
20:13:00
дейсвительно, я мог и догодаться
в таком клуче этот метод и не нужен вовсе

Roman
16.03.2018
20:14:07
ну это как пример

Alex
16.03.2018
20:14:22
да, я понял) спасибо что объяснили

Roman
16.03.2018
20:14:28
если правильно, то делаешь отдельный объект, который будет за это отвечать

Alex
16.03.2018
20:15:17
в сдучае rails - хелпер ?

Roman
16.03.2018
20:15:48
не, хэлперы - это для вьюх
просто какой-нибудь класс типа UserNotifier, в котором будет инкапсулирована вся логика для уведомлений пользователей

Alex
16.03.2018
20:17:17
я вроде читал что для моделей свои хелперы есть

Roman
16.03.2018
20:17:29
в котором методы кстати вполне могут быть только методами класса

Alex
16.03.2018
20:17:34
наверно я уже ошибаюсь в своих воспоминаниях
хм, потому что объекты этого класса не нужны

Google

Roman
16.03.2018
20:18:07
типа того

Alex
16.03.2018
20:18:17
а альтернатива есть ?

Roman
16.03.2018
20:18:48
альтернатива чему?

Alex
16.03.2018
20:19:24
созданию класса с методами класса
в ключе конкретно этой задачи

Roman
16.03.2018
20:21:05
ну могут быть и только методы экземпляров, или и то и другое, это уже смотреть надо на конкретные кейсы

Alex
16.03.2018
20:21:22

Roman
16.03.2018
20:21:58

Alex
16.03.2018
20:22:38
ну т.е. это не предусмотрено в rails в виде уже готовой папки

Roman
16.03.2018
20:22:52
нет)

Alex
16.03.2018
20:23:24
надо будет перечитать все таки ту главу в книжке
Спасибо за разъяснения)

Roman
16.03.2018
20:24:10
ну это все постигается в первый год работы, так что чем быстрее устроишься, тем лучше

Alex
16.03.2018
20:26:04
кейс звучит так, они нужно когда нужно сделать удобный способ создавать объекты, а так же когда создавать объекты не нужно, своеобразный модуль только без ''подмешивания" методов к существующим классам

Roman
16.03.2018
20:27:03
ты все усложняешь, когда пишешь ты мало об этом думаешь, просто видишь, что тут тебе нужен всегда один и тот же объект, то делаешь методы класса

Alex
16.03.2018
20:31:28
кажется теперь я осознал практическое применение
просто можно же применять не только для своих классов, но и для создания методов к базовым классам, если это нужно

Andrey
17.03.2018
03:58:26

Ro
17.03.2018
04:50:11
смотря что значит расширять
если это значит monkey patching, то это плохо

Google

Ro
17.03.2018
04:50:31
наследование - so so
композиция - можно свободно использовать
например, есть класс EncryptedString < String - это наследование
а можно сделать EcnryptedString и использовать паттерн "декоратор", где расширяемый класс будет внутри
правда в руби есть киворд extend - он путает понятие "расширение", так что я понимаю это как "улучшение функциональности"
хотя, к слову, многие gem'ы не стесняются monkey patch'ить базовые классы рубей и rails

Andrey
17.03.2018
05:56:16
Ну вот когда новые методы в базовые классы добавляют гемы это ок для меня. method_missing и прочая магия в гемах тоже ок. Но сам такого делать не буду.
Я просто смотрю какие то вещи на SO там в ответах прямо не стесняются патчить базовые классы.

Alex
17.03.2018
07:33:09
Что значит композиция?
композиция - можно свободно использовать

Admin
ERROR: S client not available

Alex
17.03.2018
07:54:19
ну к примеру так использовать вполне можно?
class String
def self.lipsum
"Lorem ipsum dolor sit amet, consectetur adipiscing elit."
end
end

Alex
17.03.2018
09:03:14
это манкей патч

Alex
17.03.2018
09:04:05
вы иметее ввиду пример кода который я скинул?

Alex
17.03.2018
09:04:46
Именно

Alex
17.03.2018
09:05:22
а что есть композиция ?
с манкей пачт как я понял плохо то что если изменить стандатрный метод, это будет неожиданным поведением и нежелательным, а если создам свой метод, то он должен быть таким что бы никогда не менялся если им будет пользоваться кто-то кроме меня

Roman
17.03.2018
09:10:09
Композиция - такой подход, альтернатива наследованию. Гуглится все кстати очень просто

Alex
17.03.2018
09:10:29
да я гуглил честное слово
первое что мне пришло в голову что это аналог наследования у двух классов, которое в руби не поддерживается

Google

Alex
17.03.2018
17:57:27
Не могу разобраться, у меня есть метод find_all и есть объект метод класс к которому выдает мне что это массив. Так вот когда я попытался найти через команду methods? или на ruby-doc такой метод в разделе Array, мне это сделать не удалось, но метод то работает когда я его использую с этим объектом
я нашел этот метод в итоге в Enumerable на ruby-doc, но почему все таки methods? мне не выдло что я могу использовтаь этот метод?

Andrey
17.03.2018
19:25:15
Что за метод? Может он через method_missing работает.

Alex
17.03.2018
19:26:08
find_all

Andrey
17.03.2018
19:27:37
Делает то он что? :)
ага это тоже что и select

Alex
17.03.2018
19:29:38
relevant_lines = lines.find_all { |line| line.include?('Truncated') } пример, lines массив со строками, он находит элементы массива в котором есть строка Truncated и возвращает эту ячейку
а find_all то что включает внутри ячейки искомое
там в ячейке может быть строка Lorem ipsum Truncated
он вернет всю ячейку со строкой внутри
я пока даже и не нашел объяснения раздела Enumerable, но понял что найду свой ответ где-то в нем

Andrey
17.03.2018
19:36:09
find_all → an_enumerator
Returns an array containing all elements of enumfor which the given block returns a true value.
select { |obj| block } → arrayclick to toggle source
select → an_enumerator
Returns an array containing all elements of enumfor which the given block returns a true value.
Тоже самое :)

Salavat
17.03.2018
19:36:45
а можно ли реализовать связь многие ко многим без использования третей таблицы?

Andrey
17.03.2018
19:37:12
Нет конечно

Alex
17.03.2018
19:37:22
Можно но не нужно

Andrey
17.03.2018
19:37:38
Не можно никак

Salavat
17.03.2018
19:38:01
тоесть нужно делать 3 таблицу и делать через has_many through

Alex
17.03.2018
19:38:06
да можно, просто производительность на самую мелкую операцию будет ниже плинтуса

Andrey
17.03.2018
19:38:21

Alex
17.03.2018
19:38:36
ну хорошо нельзя, но это возможно сделать
просто на каждый запрос предется перебирать всю таблицу