В Rails, есть ли способ указать ТИП, который вам нужен как attr_accessor, и проверить его с помощью встроенной проверки Rails? - PullRequest
6 голосов
/ 28 марта 2011

Мне никогда не удавалось найти хороший способ сделать это, поэтому я решил спросить.

Например, в модели ActiveRecord атрибуты, поддерживаемые базой данных, автоматически преобразуются по типу в соответствующие типы, поддерживаемые базой данных. Если у меня есть модель Category, и у нее есть пара атрибутов, скажем name и category_id, если я пойду так:

Category.new(params[:category])

Rails знает, что name является строкой, а category_id является целым числом.

Допустим, у меня есть несколько переходных / синтетических атрибутов, которые я хочу проверить, и у них есть определенные типы. Я хочу отправить их из формы, и мне бы хотелось, чтобы они автоматически преобразовывались либо в строку, либо в целое число, либо в дату (например) в зависимости от того, как они определены.

Если бы я объявил что-то в модели Rails, например:

attr_accessor :some_number_variable
attr_accessor :some_date

Есть ли встроенный способ сообщить Rails: «Я бы хотел, чтобы вы приводили первое к целому числу, а второе к дате, когда я иду на Category.new(params[:category])», пока params[:category][:some_number_variable] и params[:category][:some_date] являются частью данных, представляемых контроллеру (я понимаю, что пример Date может быть немного сложнее, учитывая множество форматов дат).

Ответы [ 6 ]

1 голос
/ 08 сентября 2018

Начиная с Rails 5, существует API-атрибут , который вы можете использовать следующим образом:

class SomeModel < ActiveRecord::Base
  attribute :a_checkbox_name, :boolean, default: false
end

Вы можете установить значения по умолчанию и определить свои собственные типы, среди прочего. Затем вы можете проверить эти атрибуты (виртуальные или нет), как и любые другие поддерживаемые БД.

1 голос
/ 31 марта 2011

Ни один из ответов не вполне отвечает на вопрос. Я считаю, что правильный ответ на вопросы - просто «Нет». Оба ответа касаются потенциальных обходных путей к тому факту, что ответом на вопрос является «Нет», и оба являются действительными комментариями / идеями.

0 голосов
/ 31 декабря 2012

Добавьте следующее к вашей модели:

columns_hash["birth_date"] = ActiveRecord::ConnectionAdapters::Column.new("birth_date", nil, "date")

ссылка: Rails ActiveRecord :: MultiparameterAssignmentErrors

0 голосов
/ 08 января 2012

использовать до создания ..

class Category
  attr_accessor :some_number_variable, :some_date
  before_create :validate

 private

   def validate
     return unless !!params[:category]
     #do variable casting here
   end
end
0 голосов
/ 28 марта 2011

Я предполагаю, что под «временным / синтетическим» атрибутом вы подразумеваете виртуальный атрибут?

Если это так, то здесь нет встроенной функции Rails, которая могла бы сделать это, что я могу придумать, но одним из решений было бы просто написать модуль для этих атрибутов и включить его в модель. Или, если он должен быть динамическим, вы можете вызвать атрибут как-то так: some_variable_integer, а затем обработать эти динамические атрибуты методом method_missing, прочитать имя метода и преобразовать его в требуемый тип.

На мой взгляд, они немного беспорядочные, поэтому проверки в модели - действительно ваш лучший выбор, если то, что вы хотите сделать, может их поддержать.

0 голосов
/ 28 марта 2011

attr_accesor просто создает методы чтения / записи, и это происходит от Ruby , а не от Rails. Метод Rails, который, как мне кажется, часто путают, это attr_accessible, который служит для другой цели . Если вы хотите выполнить приведение при чтении атрибута, вы можете просто переопределить читателя.

attr_accessor :some_number_variable

def some_number_variable
  @some_number_variable.to_i
end

Это, по крайней мере, даст вам писателя бесплатно. Это лучшее из известных мне решений для того, что (я думаю) вы описываете.

РЕДАКТИРОВАТЬ: Что касается проверки, я полагаю, что если вы используете Rails 3, вам будет гораздо проще выполнить проверку на атрибуты такого рода (я не сделал этого, поэтому я не могу сказать, наверняка). Теперь, когда проверки не привязаны непосредственно к ActiveRecord, я считаю, что это возможно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...