способ иметь атрибут модели, который не сохраняется в базе данных как столбец таблицы - PullRequest
1 голос
/ 14 декабря 2011

Я использую Rails v2.3.2 .

У меня есть модель:

class Cars < ActiveRecord::Base

  tag_nr = rand(2007)

end

Модель Cars сопоставлена ​​с таблицей cars в базе данных со столбцами name, owner.

Как вы видите выше, есть также tag_nr, который в основном является случайным числом .

Я хотел бы, чтобы каждый объект экземпляра из Cars class содержал случайное число , сгенерированное, как указано выше. Но Я не хочу хранить это случайное число в базе данных. И в будущем я могу получить доступ к этому экземпляру объекта tag_nr с помощью:

nr = CAR_INSTANCE.tag_nr

И nr теперь является таким же , как tag_nr, впервые созданный для этого объекта экземпляра Cars.

Итак, где и как мне определить это случайное число в моей модели автомобиля?

----------- То, что я пробовал, это: -----------

class Cars < ActiveRecord::Base
  after_initialize :init

  attr_accessor :tag_nr

  def init
    @tag_nr = rand(2007)
  end
end  

Но если я получу автомобиль из базы данных и попытаюсь получить доступ к tag_nr, я получу nil:

@c=Cars.first
@c.tag_nr.nil? # it returns true

Итак, как я могу иметь атрибут модели (например, tag_nr), который не сохраняется в базе данных как столбец таблицы, но может быть доступен как атрибут?

Ответы [ 4 ]

4 голосов
/ 14 декабря 2011

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

Вы просите об этомномер, чтобы сохранить, даже если вы хотите не сохранить его в базе данных ...

Либо информация сохраняется ... или нет.Информация, которая сохраняется, должна храниться где-то.В настоящее время ваши постоянные данные хранятся в базе данных.

Вы можете увидеть проблему здесь, я надеюсь.

Любое сгенерированное вами число будет длиться только до тех пор, пока длится объект ... т.е.продолжительность одного запроса / ответа ... и тогда он исчезнет, ​​потому что вы не сохраняете его в том месте, где хранятся данные (база данных).

Если длительность одного ответа - это все, что нужнотогда уже предложенные решения - лучшее, что вы можете получить.

Альтернативы:

  1. сохранить его в БД (это единственный способ убедиться)
  2. найдите способ хэширования уникального и неизменяемого аспекта данных в вашей модели.например, запустить MD5 или SHA1 над идентификатором записи + метка времени созданного времени
2 голосов
/ 14 декабря 2011

Попробуйте это:

class Cars < ActiveRecord::Base
  extend ActiveSupport::Memoizable

  def tag_nr
    rand(2007)
  end
  memoize :tag_nr
end

от: http://rails -bestpractices.com / posts / 59-use-memoization

0 голосов
/ 14 декабря 2011

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

car = Car.find(10)
car.tag_nr         # assume this expression returns 100
...                # some code here
other_car = Car.find(10)
car.tag_nr         # this expression returns 100

правильный

если да, вам нужно больше внимания уделять оператору =, который создает новый объект каждый раз, когда вы его используете, вы можете проверить его с помощью object_id

irb(main):074:0> "abs".object_id
=> 21413208
irb(main):075:0> "abs".object_id
=> 20742936
irb(main):076:0> a = "abs"
=> "abs"
irb(main):077:0> a.object_id
=> 21493488
irb(main):078:0> a = "abs"
=> "abs"
irb(main):079:0> a.object_id
=> 21172272

, поскольку все объекты различны, они имеют разные значения для переменных экземпляра

0 голосов
/ 14 декабря 2011

Разве это не должно быть

class Cars < ActiveRecord::Base
  after_initialize :init

  attr_accessor :tag_nr

  def init
    self.tag_nr = rand(2007)
  end
end

Пример вывода из модели лекарств (только потому, что это было то, над чем я работал в то время)

> d = Drug.first

=> #<Drug id: 1, name: "NSAIDs", category: "NSAID", comment: "Non-steroidal anti-inflammatory", created_at: "2011-11-23 17:46:22", updated_at: "2011-11-23 17:46:22">

> d.tag_nr

=> 1069

> d = Drug.last

=> #<Drug id: 6, name: "Antihypertensives", category: "ANTIHYPERTENSIVE", comment: "", created_at: "2011-11-23 17:46:22", updated_at: "2011-11-23 17:46:22">

> d.tag_nr

=> 1838

> d = Drug.first

=> #<Drug id: 1, name: "NSAIDs", category: "NSAID", comment: "Non-steroidal anti-inflammatory", created_at: "2011-11-23 17:46:22", updated_at: "2011-11-23 17:46:22">

> d.tag_nr

=> 800

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

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