Closed CarbazochromeT closed 1 year ago
Ransackでenum的なものを使う時は検索フォームからparamsで送る値に気をつけないといけなかったような気がするのでそもそもどういう形式でRansackに値を渡してあげれば検索できるようになるのかを検証して、それに沿うような形で実装すると良いかと思います
下記の記事とかが古いですが関係あるような気がします https://www.tom08.net/2016-12-05-121746/
コメントありがとうございます。
https://spirits.appirits.com/doruby/8917/?cn-reloaded=1 https://blog.to-ko-s.com/enum-select-box/
こちらの記事を見ながらハッシュ形式で送っております。 また、今回はenum_helpではなくEnumerizeを使用しているため、もしかしたら若干扱い方が変わるかもしれません。
drug.rb
enumerize :formulation, in: { :tablet => 0, :powder => 1, :capsule => 2, :liquid => 3, :nose => 4 }, scope: :true
irb(main):007:0> Drug.formulation.values
=>
["tablet",
"powder",
"capsule",
"liquid",
"nose"]
irb(main):008:0> Drug.formulation.options
=>
[["錠剤", "tablet"],
["散剤", "powder"],
["カプセル", "capsule"],
["液剤", "liquid"],
["点鼻薬", "nose"]]
valuesを使用すると今文字列が来てしまっているのですが、今回はテーブルの中身は数字で入っているので、valuesを使用した際に数字が呼び出せるようにしたいです。
https://github.com/brainspec/enumerize/issues/158#issuecomment-45342892
上記のissueを参考に下記の形とかで行けないですかね?
Drug.formulation.values.map { |v| [v.value] }
<%= f.collection_check_boxes :formulation, Drug.formulation.values.map { |v| [v.value] }, :last, :first do |b| %>
<li>
<label class="CheckboxInput">
<%= b.check_box(class: "CheckboxInput-Input") %>
<span class="CheckboxInput-DummyInput"></span>
<%= b.label(class: "CheckboxInput-LabelText") %>
</label>
</li>
<% end %>
表示が「錠剤」、「散剤」から番号に変わってしまいました。
Parameters: {"q"=>{"ingredients_name_cont"=>"", "name_cont"=>"", "symptoms_name_in"=>[""], "formulation"=>["", "0", "1", "2"], "ingredients_drive_eq"=>"false", "ingredients_tobacco_eq"=>"true", "ingredients_alcohol_eq"=>"false"}, "commit"=>"検索"}
20:17:48 web.1 | Rendering layout layouts/application.html.erb
20:17:48 web.1 | Rendering drugs/index.html.erb within layouts/application
20:17:48 web.1 | Symptom Load (0.4ms) SELECT `symptoms`.* FROM `symptoms`
20:17:48 web.1 | ↳ app/views/drugs/_search.html.erb:25
20:17:48 web.1 | Rendered drugs/_search.html.erb (Duration: 16.1ms | Allocations: 5463)
20:17:48 web.1 | Drug Load (1.3ms) SELECT DISTINCT `drugs`.* FROM `drugs` LEFT OUTER JOIN `drug_ingredients` ON `drug_ingredients`.`drug_id` = `drugs`.`id` LEFT OUTER JOIN `ingredients` ON `ingredients`.`id` = `drug_ingredients`.`ingredient_id` WHERE (`ingredients`.`drive` = 'false' AND `ingredients`.`tobacco` = 'true' AND `ingredients`.`alcohol` = 'false') LIMIT 10 OFFSET 0
valuesを使用した際に数字が呼び出せるようにしたいです。
数字が呼び出せるようにしたかったのかなと思っていたのですが違かったですかね...?
f.collection_check_boxesにどんな値を渡したいのか実際に渡したい値(配列?)を記述していただいて良いでしょうか?
伝わりにくくてすみません。 チェックボックスの表示は「錠剤」、「散剤」などの日本語表示で、渡したい値は「0」、「1」などの数字です。 チェックボックスを押すと入力が反映されるようにしたいです。
[0, 1, 2]とか[["錠剤", 0], ["散剤", 1]]みたいな感じで日本語ではなく実際にf.collection_check_boxesに渡したい値を書いてもらえるとイメージしやすいです
https://qiita.com/Shokichi_jp/items/b97d6c48f295a3d54a81 こちらのサイトを参考に、例えばですが、
irb(main):001:0> Drug.formulation
=> {"tablet"=>0, "powder"=>1, ...}
irb(main):002:0> Drug.formulation.keys
=> ["tablet", "powder", ...]
のようになるのが理想系ですね
{"tablet"=>0, "powder"=>1, ...}
のようにしたいのであれば
Drug.formulation.values.map { |v| [v.text, v.value] }.to_h
とかで行けないですかね?
["tablet", "powder", ...]
は書いてくれている実行ログをみる感じDrug.formulation.values
でとれてそうな気がします
こちらで書き直してみました。
<ul class= "search-list">
<%= f.collection_check_boxes :formulation, Drug.formulation.values.map { |v| [v.text, v.value] }.to_h, :last, :first do |b| %>
<li>
<label class="CheckboxInput">
<%= b.check_box(class: "CheckboxInput-Input") %>
<span class="CheckboxInput-DummyInput"></span>
<%= b.label(class: "CheckboxInput-LabelText") %>
</label>
</li>
<% end %>
</ul>
錠剤ラベルが反映され、数字が行き渡るようになりました!ありがとうございます!
Parameters: {"q"=>{"ingredients_name_cont"=>"", "name_cont"=>"", "symptoms_name_in"=>["", "1", "2", "3", "4"], "formulation"=>["", "2", "3"], "ingredients_drive_eq"=>"true", "ingredients_tobacco_eq"=>"true", "ingredients_alcohol_eq"=>"false"}, "commit"=>"検索"}
09:19:22 web.1 | Rendering layout layouts/application.html.erb
09:19:22 web.1 | Rendering drugs/index.html.erb within layouts/application
09:19:22 web.1 | Symptom Load (0.4ms) SELECT `symptoms`.* FROM `symptoms`
09:19:22 web.1 | ↳ app/views/drugs/_search.html.erb:25
09:19:22 web.1 | Rendered drugs/_search.html.erb (Duration: 15.4ms | Allocations: 6044)
09:19:22 web.1 | Drug Load (0.7ms) SELECT DISTINCT `drugs`.* FROM `drugs` LEFT OUTER JOIN `drug_symptoms` ON `drug_symptoms`.`drug_id` = `drugs`.`id` LEFT OUTER JOIN `symptoms` ON `symptoms`.`id` = `drug_symptoms`.`symptom_id` LEFT OUTER JOIN `drug_ingredients` ON `drug_ingredients`.`drug_id` = `drugs`.`id` LEFT OUTER JOIN `ingredients` ON `ingredients`.`id` = `drug_ingredients`.`ingredient_id` WHERE (`symptoms`.`name` IN ('1', '2', '3', '4') AND `ingredients`.`drive` = 'true' AND `ingredients`.`tobacco` = 'true' AND `ingredients`.`alcohol` = 'false') LIMIT 10 OFFSET 0
お世話になっております。 https://l-chika.hatenablog.com/entry/2017/02/08/235827 https://qiita.com/kamelo151515/items/3b91cdf5deccc862cba2 https://dyson.work/2020/09/21/collection-check-box/
上記サイトを参考にし、Ransackに対応した検索機能を実装することを試みております。 今現在、Drugテーブル内のformulationカラムをRansackの検索結果に載せたいのですが、エラーが発生してしまうので、ご助言をいただきたく思います。
Drugテーブル内のデータ
schema.rb
drug.rb
チェックボックスを押すとformulationで定義したものと対応した数字が検索結果に反映されるようにしたいです。
しかし、実際の検索結果は、キーではなく「"tablet", "powder", "capsule"」のようなハッシュの方が呼び出されてしまいます。
そこで、チェックボックスの値を
Drug.formulation.values
に変更すると、配列の中身が変わってきてしまいます。また、value_hashに変更してみると、エラーが発生してしまいます。
こちらでも試してみましたが、mapが定義されていないと言われてしまい、うまくいきません。
Enumerizeのモジュールを参考にしていますが、mapがどのように機能しているのか、理解が追いつかず…。 https://github.com/brainspec/enumerize/blob/master/lib/enumerize/attribute.rb
drug.rbにメソッドを追記してからviewファイルを記載した場合も、エラーが発生してしまいました。
ご助言のほどよろしくお願いいたします。
drugs_controller.rb
drugs/_search.html.erb