Перейти к содержимому

Фото
* * * * * 1 голосов

Курилка для программистов


  • Вы не можете создать новую тему
  • Please log in to reply
1087 ответов в этой теме

#661 Дык

Дык
  • Постоялец
  • 10 897 сообщений
  • Откуда:/dev/null

Отправлено 02 марта 2017 - 17:36

Так у тебя тогда другая задача - просто h[key]=<new value>. И всё. Или я что-то не понимаю. Выложи свой пример. 


  • 0

Вначале делаю, потом думаю :)


#662 Zero

Zero

    TRUST NO ONE

  • Постоялец
  • 10 668 сообщений
  • Откуда:Таллин

Отправлено 02 марта 2017 - 17:57

del

Видимо, я как-то иначе понимаю "обновить по ключу".


Сообщение изменено: Zero (02 марта 2017 - 17:59 )

  • 0
Моя Родина - СССР! Пролетарии всех стран, соединяйтесь!
-----------------------------------------------------------------------
Ясность - одна из форм полного тумана. Форумчане, давайте жить дружно!

#663 kuznets

kuznets
  • Постоялец
  • 5 850 сообщений

Отправлено 02 марта 2017 - 18:04

arr: {"utf8"=>"✓",  "item"=>{"name"=>"aaa", "unit_price"=>"1,00"}}
Мне надо поменять "unit_price"=>"1,00" на "unit_price"=>"100"
puts arr["unit_price"] # => 1,00
arr["unit_price"] = "100"
puts arr["unit_price"] # => 1,00
 
Начал копать гугл, вот такие примеры реализации.
Я конечно понимаю, что так тупо arr["unit_price"] = "100" тоже нельзя с вложенными массивами, а как он тогда мне puts arr["unit_price"] # => 1,00 показывает?

Сообщение изменено: kuznets (02 марта 2017 - 18:06 )

  • -1

Типичный, классический кузнец.


#664 Дык

Дык
  • Постоялец
  • 10 897 сообщений
  • Откуда:/dev/null

Отправлено 02 марта 2017 - 18:18

Что-то тут не то. Ты обращаешься к несуществующему ключу хэша и каким-то образом получаешь значение 1,00 (должно вернуть nil). А потом обновляешь (устанавливаешь) значение не туда, куда надо.

Сделаю так же маленькую ремарку. То, с чем ты имеешь дело - это хэш(Hash). Массив (Array) - это обычная коллекция. Если кто-то другой будет работать с твоим кодом, он не поймет, зачем ты одно обозвал другим (имеется ввиду имя переменной "arr")


Сообщение изменено: Дык (02 марта 2017 - 18:20 )

  • 0

Вначале делаю, потом думаю :)


#665 kuznets

kuznets
  • Постоялец
  • 5 850 сообщений

Отправлено 02 марта 2017 - 18:51

Ну ок хэш.

 

вот так точнее:

def create
	@item = current_user.items.new(item_params)
	puts 'Params 1:'
	puts item_params
	puts 'Item Price: ' + item_params["unit_price"]
	...
end

## Вывод в консоли ##
Started POST "/items" for 127.0.0.1 at 2017-03-02 18:43:16 +0200
Processing by ItemsController#create as HTML
  Parameters: {"utf8"=>"✓", "item"=>{"name"=>"aaa", "unit_price"=>"1,00"}, "commit"=>"Save Item"}
  User Load (1.7ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = ? ORDER BY "users"."id" ASC LIMIT ?  [["id", 2], ["LIMIT", 1]]
Params 1:
#<ActionController::Parameters:0x007f4925d99f20>
Item Price: 1,00

Попробовал так:

price = '100'
item_params.each do |key|
	if key == 'item'
		key.each do |key2|
			if key2 == 'unit_price'
				key2 = price
			end
		end
	end
end

# результат
puts 'Item Price: ' + item_params["unit_price"] # => Item Price: 1,00

Сообщение изменено: kuznets (02 марта 2017 - 18:53 )

  • -1

Типичный, классический кузнец.


#666 Дык

Дык
  • Постоялец
  • 10 897 сообщений
  • Откуда:/dev/null

Отправлено 02 марта 2017 - 19:07

Хоть ты и не выложил метод "item_params", я предполагаю, что там должно быть что-то вроде этого:

def item_params

  item_params = params.require(:item).permit(:name, :unit_price) # залезаем в сам item. остальные параметры нам не нужны. NB! Возможно надо сделать ".to_h" в конце.

  item_params[:unit_price] *= 100 # это моё предположение относительно того, что ты пытаешься сделать
  item_params

end

При очень большом желании можно и в одну строку сделать, но это так, допом ))


Сообщение изменено: Дык (02 марта 2017 - 19:10 )

  • 0

Вначале делаю, потом думаю :)


#667 kuznets

kuznets
  • Постоялец
  • 5 850 сообщений

Отправлено 02 марта 2017 - 19:10

Там такое

 

def item_params
    params.require(:item).permit(:name, :unit_price)
end
 
item_params использется и в других методах где не надо что бы :unit_price ровнялась 100
Мне нужно при создании item убирать запятую из стоимости и записывать в базу большое число 1,00 еур как 100. Естественно я тут не привожу манипуляцию с запятой, а просто записываю число 100 для наглядности.

Сообщение изменено: kuznets (02 марта 2017 - 19:16 )

  • 1

Типичный, классический кузнец.


#668 Дык

Дык
  • Постоялец
  • 10 897 сообщений
  • Откуда:/dev/null

Отправлено 02 марта 2017 - 19:23

В таком случае копируй результат метода в переменную и уже на месте делай преобразование.
 

item_params = self.item_params.dup # (dup не обязательно, но на всякий случай, если будешь в будущем кэшировать (мемоизировать) результат метода. Иначе ты перепишешь исходные данные
item_params[:unit_price] *= 100 # или любым другим методом
current_user.items.create!(item_params)

Сообщение изменено: Дык (02 марта 2017 - 19:24 )

  • 0

Вначале делаю, потом думаю :)


#669 Zero

Zero

    TRUST NO ONE

  • Постоялец
  • 10 668 сообщений
  • Откуда:Таллин

Отправлено 02 марта 2017 - 20:57

Сделаю так же маленькую ремарку. То, с чем ты имеешь дело - это хэш(Hash). Массив (Array) - это обычная коллекция.

Это не очень хорошая ремарка, кмк. Или само название Hash отражает детали реализации, а не свойства структуры данных.


  • 0
Моя Родина - СССР! Пролетарии всех стран, соединяйтесь!
-----------------------------------------------------------------------
Ясность - одна из форм полного тумана. Форумчане, давайте жить дружно!

#670 kuznets

kuznets
  • Постоялец
  • 5 850 сообщений

Отправлено 02 марта 2017 - 21:35

Навесил я все  эту батву на идею, запили дебагинг

item_params.each do |key|
end

Итерирует по массиву или хэшу мне в данном случае пока что одночленно {"name"=>"aaa", "unit_price"=>"1,00"}

item_params.each do |key|
  if key == 'unit_price' # true
    item_params[key] = price # хз что, но на выходе, 
    # он его проходит а состояние item_params я не вижу в дебагере
  end
end



  • 0

Типичный, классический кузнец.


#671 Дык

Дык
  • Постоялец
  • 10 897 сообщений
  • Откуда:/dev/null

Отправлено 02 марта 2017 - 21:44

 

Навесил я все  эту батву на идею, запили дебагинг

item_params.each do |key|
end

Итерирует по массиву или хэшу мне в данном случае пока что одночленно {"name"=>"aaa", "unit_price"=>"1,00"}

item_params.each do |key|
  if key == 'unit_price' # true
    item_params[key] = price # хз что, но на выходе, 
    # он его проходит а состояние item_params я не вижу в дебагере
  end
end


А зачем ты итерируешь по ключам? Что ты хочешь добиться? 


  • 0

Вначале делаю, потом думаю :)


#672 kuznets

kuznets
  • Постоялец
  • 5 850 сообщений

Отправлено 02 марта 2017 - 22:01

По каким ключам? Это они оказались ключами |key| в данном случае мог быть и |lalala|. Итерировать я хочу по паре key:value, проверять key на совпадение именять value, но я в упор не понимаю как.


  • 0

Типичный, классический кузнец.


#673 Дык

Дык
  • Постоялец
  • 10 897 сообщений
  • Откуда:/dev/null

Отправлено 02 марта 2017 - 22:03

item_params.each do |key, value|

Только я не могу понять, зачем тут вообще линейное сканирование для чего-либо?


  • 0

Вначале делаю, потом думаю :)


#674 kuznets

kuznets
  • Постоялец
  • 5 850 сообщений

Отправлено 02 марта 2017 - 22:09

Только я не могу понять, зачем тут вообще линейное сканирование для чего-либо?

А переведи  :)


  • 0

Типичный, классический кузнец.


#675 Дык

Дык
  • Постоялец
  • 10 897 сообщений
  • Откуда:/dev/null

Отправлено 02 марта 2017 - 22:23

А переведи  :)

.each - это прохождение по всем ключам (или парам ключ-значение). И ты по ним проходишься только ради того, чтобы найти 'unit_price' и обновить значение (если найдено).
Цена такого подхода - O(N).
item_params[:unit_price]=<new val> -> O(1). Или я что-то упускаю из виду?

P.S Обрати внимание при работе с Hash, что доступ по стринговому ключу (String) не тоже самое, что и доступ по символьному ключу (Symbol). 
item_params[:unit_price] != item_params['unit_price'], если только "item_params" не экземпляр класса HashWithIndifferentAccess, которому на это дело наплевать.


  • 0

Вначале делаю, потом думаю :)


#676 kuznets

kuznets
  • Постоялец
  • 5 850 сообщений

Отправлено 02 марта 2017 - 23:01

То, что это прохождение по ключам это я понял. 

Из стандартных языков в вполне осознал что пройтись по ключам, что бы найти 'unit_price' вполне норма тема, но тут я писал выше кому то было скучно и работу с массивами / хэшами сделали крайне интересной ))

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

В общем я пока не понял как решить мою проблему.


  • 0

Типичный, классический кузнец.


#677 Transhumanist

Transhumanist
  • Постоялец
  • 1 783 сообщений
  • Откуда:Schweiz, Zürich

Отправлено 02 марта 2017 - 23:17

Какой интересный диалог... Я Руби первый раз вижу. Но неужели с ним такие сложности?

 

 

arr: {"utf8"=>"✓",  "item"=>{"name"=>"aaa", "unit_price"=>"1,00"}}

Мне надо поменять "unit_price"=>"1,00" на "unit_price"=>"100"
puts arr["unit_price"] # => 1,00
arr["unit_price"] = "100"
puts arr["unit_price"] # => 1,00

 

Этот arr разве не является вложенным hash'ем? Почему нельзя получить доступ к значению unit_price через arr["item"]["unit_price"] ?


  • 0

#678 kuznets

kuznets
  • Постоялец
  • 5 850 сообщений

Отправлено 02 марта 2017 - 23:39

Какой интересный диалог... Я Руби первый раз вижу. Но неужели с ним такие сложности?

 

 

Этот arr разве не является вложенным hash'ем? Почему нельзя получить доступ к значению unit_price через arr["item"]["unit_price"] ?

А вот нельзя. Я сегодня с ним целый день снашаюсь, завтра видимо продолжу.


Сообщение изменено: kuznets (02 марта 2017 - 23:40 )

  • 0

Типичный, классический кузнец.


#679 Transhumanist

Transhumanist
  • Постоялец
  • 1 783 сообщений
  • Откуда:Schweiz, Zürich

Отправлено 02 марта 2017 - 23:52

А вот нельзя.

 

Мда? А почему мне можно?

 

Пробую на https://repl.it/languages/ruby

 

Код:

arr = {"utf8"=>"✓",  "item"=>{"name"=>"aaa", "unit_price"=>"1,00"}}
puts arr["item"]
puts arr["item"]["unit_price"]
arr["item"]["unit_price"] = 100
puts arr["item"]["unit_price"]

Консоль:

ruby 2.3.1p112 (2016-04-26 revision 54768) [x86_64-linux]
   
{"name"=>"aaa", "unit_price"=>"1,00"}
1,00
100
=> nil

  • 0

#680 kuznets

kuznets
  • Постоялец
  • 5 850 сообщений

Отправлено 02 марта 2017 - 23:55

С утра ченить отвечу, вырубает уже.


  • 0

Типичный, классический кузнец.


#681 kuznets

kuznets
  • Постоялец
  • 5 850 сообщений

Отправлено 03 марта 2017 - 08:08

Alexey_L

 

Как я писал выше там не этот хэш arr = {"utf8"=>"✓", "item"=>{"name"=>"aaa", "unit_price"=>"1,00"}}

def create
  @item = current_user.item.new(item_params)
  puts 'Params 1:'
  puts item_params
  puts 'Item Price: ' + item_params["unit_price"]

  price = '100'

  item_params["unit_price"] = price # пытаюсь присвоить по ключу как у тебя в примере
  puts 'Total Price: ' + item_params["unit_price"]
end

## Консоль ##
## item_params это <ActionController::Parameters:0x007fc6d057ea60> но итерация each do идет по нему "item"=>{"name"=>"aaa", "unit_price"=>"1,00"} 
## 

Params 1:
#<ActionController::Parameters:0x007fc6d057ea60>
Item Price: 1,00
Total Price: 1,00

Скопировал в отдельную переменную item_params

params = stock_params # что есть этот  <ActionController::Parameters:0x007fc6dd0ec2b0> ?

 

картинка

 

https://3.downloader...f10c2e9555851db


Сообщение изменено: kuznets (03 марта 2017 - 08:19 )

  • 0

Типичный, классический кузнец.


#682 kuznets

kuznets
  • Постоялец
  • 5 850 сообщений

Отправлено 03 марта 2017 - 08:41

Ну вот и ответ http://stackoverflow...s-strong-params

Теперь все работает как надо.


  • 0

Типичный, классический кузнец.


#683 Дык

Дык
  • Постоялец
  • 10 897 сообщений
  • Откуда:/dev/null

Отправлено 03 марта 2017 - 08:52

Это разве не то же самое, что я тебе написал в посте 668?


  • 0

Вначале делаю, потом думаю :)


#684 kuznets

kuznets
  • Постоялец
  • 5 850 сообщений

Отправлено 03 марта 2017 - 09:19

Это разве не то же самое, что я тебе написал в посте 668?

Тоже, но менее развернуто, а гадать я не умею. Но я прошел путь секаса с сабжем и стал понимать откуда нори растут, а не тупо копирнул часть кода, что ценнее )


  • 0

Типичный, классический кузнец.


#685 Bruce Wayne

Bruce Wayne

    The Dark Knight

  • Постоялец
  • 2 811 сообщений
  • Откуда:Gotham City

Отправлено 03 марта 2017 - 09:30

руби говно )


  • 1

если я покажу свои сиськи то ты не отстанешь от них никогда, и я стану в сто раз популярнее всех баб на форуме и язык у тебя прилипнет к бороде)))) Потому что у меня очень роскошный бюст, но я ни за что не нуждаюсь, чтоб на него пялились похотливые ненасытные брюсы; // удалите сообщения с моей синей фоткой где я под феном  :D , я вам другую поставлю)))

 


#686 Transhumanist

Transhumanist
  • Постоялец
  • 1 783 сообщений
  • Откуда:Schweiz, Zürich

Отправлено 03 марта 2017 - 09:32

руби говно )


Почему?
  • 0

#687 kuznets

kuznets
  • Постоялец
  • 5 850 сообщений

Отправлено 03 марта 2017 - 09:42

Я за последние 3 недели сделал 2 небольших проекта на node и ruby (с нуля), первый мне понравился больше, хотя по началу меня подкупала простота руби, как то само все делает за тебя, он отлавливать баги сложнее, да и синтаксис несколько отличается от привычного.


  • 0

Типичный, классический кузнец.


#688 Дык

Дык
  • Постоялец
  • 10 897 сообщений
  • Откуда:/dev/null

Отправлено 03 марта 2017 - 10:01

С гемом "byebug" баги отлавливаются на раз-два. Сам руби, имхо, простой. Рельсы могут иметь свои приколы, как маленькие, так и не очень (non-thread safe участки кода).


  • 0

Вначале делаю, потом думаю :)


#689 kuznets

kuznets
  • Постоялец
  • 5 850 сообщений

Отправлено 03 марта 2017 - 10:50

Ну вряд ли за неделю можно сложить хорошее представление. Надо будет использовать руби, буду использовать руби, это всего лишь инструмент.
  • 0

Типичный, классический кузнец.


#690 Bruce Wayne

Bruce Wayne

    The Dark Knight

  • Постоялец
  • 2 811 сообщений
  • Откуда:Gotham City

Отправлено 03 марта 2017 - 19:31

если тебе надо будет использовать руби, то не надо тебе его лучше использовать))


  • 0

если я покажу свои сиськи то ты не отстанешь от них никогда, и я стану в сто раз популярнее всех баб на форуме и язык у тебя прилипнет к бороде)))) Потому что у меня очень роскошный бюст, но я ни за что не нуждаюсь, чтоб на него пялились похотливые ненасытные брюсы; // удалите сообщения с моей синей фоткой где я под феном  :D , я вам другую поставлю)))