169 похожих чатов

А можно как-нибудь на уровне модели запретить прямой вызов

AR через имя класса модели?
Например есть модель Post.
belongs_to :project.
Надо запретить вызовы типа Post.where, Post.find и прочие

8 ответов

18 просмотров

можно рубокоп написать на это

Alexey- Автор вопроса

Да, можно сделать это, используя концепцию "полиморфизма". В Rails модели реализуют метод self.method_missing, который вызывается, когда вызывается неизвестный метод класса. Вы можете переопределить этот метод в вашей модели Post и бросить исключение, если вызывается метод, который вы не хотите разрешить. Вот пример, который блокирует вызовы where, find и all через имя класса модели: class Post < ActiveRecord::Base   belongs_to :project   def self.method_missing(method_name, *args, &block)     if method_name == :where method_name == :find method_name == :all       raise NoMethodError, "Direct calls to #{self}.#{method_name} are not allowed"     else       super     end   end end Теперь, когда вы попытаетесь вызвать Post.where, Post.find или Post.all, будет создано исключение NoMethodError. Чтобы вызвать эти методы, вам нужно будет использовать экземпляр модели Post, например post_model = Post.new или post_model.where.

Alexey- Автор вопроса
Федор
Да, можно сделать это, используя концепцию "полимо...

Вы сами это писали? Стиль изложения очень похож на ChatGPT )

Федор
Да, можно сделать это, используя концепцию "полимо...

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

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

Обсуждают сегодня

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
Ребят в СИ можно реализовать ООП?
Николай
33
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
у вас два процесса. один посылает другому сигнал. у вас есть код обоих процессов? если всё не так - расскажите как оно на самом деле. а именно кто кому чего, есть-ли консоли,...
Karagy
6
Карта сайта