В Rails правильно ссылаться на другой метод, чтобы применить изменения к существующим данным? - PullRequest
0 голосов
/ 13 июня 2018

Я пытаюсь добавить слагов для своих пользователей и не могу использовать гем friendly_id из-за того, как он влияет на пользователей, которых вводят из CMS, и сталкивается с проблемами при применении слагов.

Так и у моего пользователяУ меня есть следующая таблица:

create_table "users", id: :serial, force: :cascade do |t|
t.string "first_name"
t.string "last_name"
t.text "bio"
t.string "title"
t.string "avatar_file_name"
t.string "avatar_content_type"
t.integer "avatar_file_size"
t.datetime "avatar_updated_at"
t.string "slug"
end

В модели приложения

def to_slug(string)
 string.parameterize.truncate(80, omission: '')
end

В модели пользователя

def set_url_name
  self.full_name = [first_name, last_name].join('-')
end

def self.add_slugs
  update(url_name: to_slug(set_url_name))
end

def to_param
  slug
end

Моя мысль была с тех пор, как first_name и last_nameотдельные поля, я должен объединить их с тире для установки url_name.Поэтому, когда я попадаю в консоль rails, я пытаюсь применить это к существующим данным, выполняя:

User.add_slugs

В итоге получаю

NameError: undefined local variable or method `set_url_name''
Did you mean?  sti_name
from /Users/username/.rvm/gems/ruby-2.4.1/gems/activerecord-5.1.4/lib/active_record/dynamic_matchers.rb:22:in `method_missing'

Первое, что я хочу сказать, - это мой метод set_url_name isn 'т т правильно, поэтому я попытался:

def self.add_slugs
 update(slug: to_slug(name))
end

В результате:

NoMethodError: undefined method `to_slug' for #<Class:0x007fc624e376e0>
Did you mean?  to_s

Я также изменил имя с: first_name, first_name,: last_name и last_name.Все с тем же вопросом.Любое руководство?

Ответы [ 2 ]

0 голосов
/ 13 июня 2018

Проблема в том, что set_url_name является методом экземпляра, а self.add_slugs является методом класса.Внутри метода self.add_class self относится к классу User, а не к экземпляру пользователя.

Что вам действительно нужно, это что-то вроде следующего:

def self.add_slugs
  self.find_each do |user|
    user.update(slug: user.to_slug(user.set_url_name))
  end
end
0 голосов
/ 13 июня 2018

В вашем коде есть несколько проблем:

  1. Метод update обновляет только одну запись.
  2. Метод set_url_name должен просто возвращать значение, а не пытаться установить другую несуществующую переменную.
  3. Метод to_slug не существует в классе, это метод уровня экземпляра,

Это то, что вы хотите:

def self.to_slugs
  self.find_each do |u|
    s = [u.first_name, u.last_name].join('-').parameterize.truncate(80, omission: '')
    u.update(slug: s)
  end
end

Вы должны циклически проходить через каждый из них и вызывать update отдельно, потому что вы создаете значение вне SQL, иначе вы можете использовать update_all.

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