Ruby и ActiveRecord инициализируют - PullRequest
0 голосов
/ 03 марта 2019

Я изучаю интеграцию ActiveRecord с Ruby и пытаюсь сделать то же самое, что и без него, но продолжаю терпеть неудачу.

Вот что я сделал без AR:

 class User

  include FirstLastAge

  attr_reader :first_name, :last_name, :age

  @@all = []

  def self.all
    @@all
  end

  def initialize(first_name = first.sample, last_name = last.sample, age = rand_age)
    @first_name = first_name
    @last_name = last_name
    @age = age
    self.class.all << self
  end

end

# dat = SQLite3::Database.new('test.db')
# dat.execute("CREATE TABLE users (id INTEGER PRIMARY KEY, first_name TEXT, last_name TEXT, age INTEGER);")

FirstLastAge - это модуль с 3 методами, #first возвращает массив имен, #last и # rand_age.

С помощью этой настройки я могу 5000.times User.new, а затем выполнить итерациючерез них и создайте запись в БД.

Так что теперь я пытался сделать то же самое с AR, но безуспешно.

# User class
require_relative '../modules/names.rb'
class User < ActiveRecord::Base
  include FirstLastAge
end

С этой схемой:

create_table "users", force: :cascade do |t|
    t.string "first_name"
    t.string "last_name"
    t.integer "age"
  end

end

Получил этот результат:

4] pry(main)> a = User.new
=> #<User:0x00007fb8bc1e16b8 id: nil, first_name: nil, last_name: nil, age: nil>
[5] pry(main)> a.first #Calling from the module
=> "Rossi"
[6] pry(main)> a.first #Calling from the module
=> "Xander"
[7] pry(main)> a.last #Calling from the module
=> "Patton"
[8] pry(main)> a.rand_age #Calling from the module
=> 11
[9] pry(main)> x = User.new(first_name: 'Alex', last_name: "Patton", age: 45)
=> #<User:0x00007fb8bdf1ccc8 id: nil, first_name: "Alex", last_name: "Patton", age: 45>
[10] pry(main)> y = User.new(first_name: first, last_name: "Patton", age: 45)
NameError: undefined local variable or method `first' for main:Object
from (pry):7:in `__pry__'
[11] pry(main)> y = User.new(first_name: self.first, last_name: "Patton", age: 45)
NoMethodError: undefined method `first' for main:Object
from (pry):8:in `__pry__'
[12] pry(main)> y = User.new(first_name: User.first, last_name: "Patton", age: 45)
=> #<User:0x00007fb8bc4a9bc0 id: nil, first_name: nil, last_name: "Patton", age: 45>
[13] pry(main)> y = User.new(first_name: User.first, last_name: "Patton", age: User.rand_age)
NoMethodError: undefined method `rand_age' for #<Class:0x00007fb8bc4a36d0>
from /Users/alex/.rvm/gems/ruby-2.5.3/gems/activerecord-5.2.2/lib/active_record/dynamic_matchers.rb:22:in `method_missing'

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

34] pry(main)> 
[35] pry(main)> 
[36] pry(main)> User.new.first
=> "Rihan"
[37] pry(main)> User.new.last
=> "Beck"
[38] pry(main)> User.new.rand_age
=> 24
[39] pry(main)> x = User.new(first_name: User.new.first, last_name: User.new.last, age: User.new.rand)
User.new.rand           User.new.random_add     User.new.random_iv      User.new.random_number  
User.new.rand_age       User.new.random_bytes   User.new.random_key     
[39] pry(main)> x = User.new(first_name: User.new.first, last_name: User.new.last, age: User.new.rand_age)
=> #<User:0x00007fc664559588 id: nil, first_name: "Taylan", last_name: "Trevino", age: 74>
[40] pry(main)> y = User.new(first_name: User.new.first, last_name: User.new.last, age: User.new.rand_age)
=> #<User:0x00007fc6630dfd50 id: nil, first_name: "Sanaullah", last_name: "Koch", age: 56>
[41] pry(main)> 

Есть идеи о том, что происходит, и как бы вы это сделали?

Спасибо.

Обновление.

module FirstLastAge
    def first
        [array with 2000 names...to big to paste here].sample
    end
    def last
        [array with 1000 names...to big to paste here].sample
    end
    def rand_age
        rand(1..111)
    end
end

Я тоже поставилmodule_function: first,: last,: rand_age now.поэтому я могу назвать их как FirstLastAge.rand_name.

1 Ответ

0 голосов
/ 03 марта 2019

Что касается первого результата, причина, по которой вы получили 2 ошибки:

  1. Вы забыли определить first в своей консоли, я думаю, что вы пытались вместо этого вызвать a.first
  2. Вы пытались вызвать User.rand_age, но это мгновенный метод, а не метод класса, поэтому вы не можете вызывать его таким образом.

Что касается второго результата, то оннемного отличается от первого результата.Вы использовали мгновенные методы (User.new.first и User.new.rand_age) вместо использования метода класса, так что да, ваш код работает.

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