TECH::CAMP(テックキャンプ)97期短期集中講座(オンライン)受講者の感想

良かった点

① 受講者でグループを作るため、サボりにくい

 同時期に始めた受講者とグループを作ります(私は6人グループでした)。同じ時間勉強をしているはずなのに、明らかに早い人がいて「私も頑張らなければ」と思いながら講義を進めらました。

 時間割が決まっており、定期的に進捗状況が掴めるため、「さっきの時間集中できていなかったんだろうな」とか「何があったの!?」て言うくらい早い人がいて、孤独感がなくて勉強しやすかったです。

 

② グループの人と仲良くなれる

 私は5月にテックキャンプを卒業していますが、受講時のメンバーの数人とはいまだに連絡をとっています。例えば、お互いの就活状況やオリジナルアプリの進捗状況をしたり、オンラインで飲み会を行ったりなどを行っています。面接官の話を共有したり、今はそうでもないが、コロナ禍の愚痴だったり、気軽に話せるので、受講時はもちろん、心が荒みやすい就活中にも大変助けになりました。

 

③ ライフコーチ及びキャリアアドバイザーが話を聞いてくれる

 私は自分の思っていることをなるべくなら喋りたい人です。しかし、お互い就活で忙しいグループメンバーに延々と話を聞かせてしまうのも、心ぐるしいと思ってしまいます。同様に家族や友人にも、「そんな話よりも就活しよう?」という空気が出てしまうなど、なかなか「延々と喋り続ける」ということができませんでした。そんななか、私の話を聞かざるをえない存在が、いました。それがライフコーチとキャリアアドバイザーです。講義中はライフコーチ、講義中及び講義後はキャリアアドバイザーという人がついて、それぞれ受講状況のサポートや就活状況のサポートをしてくれますが、この人たちは「私の話を聞かざるを得ない」のです。私はこれ幸いと言いたいことを言いまくりました。私の講義中のなかなか進められないストレスもそれで軽減されたし、就活中の言いようのない不安によるストレスもそれで軽減されたのではないかと思っております。本来の業務とは大変違い、私の延々と続く長ったらしい話を笑顔で延々と聞き続けてくれたライフコーチとキャリアアドバイザーの方々には感謝しております。

 

悪かった点

① テキストにわかりにくい箇所がある

 私が受講していた当時のことですので、もう修正されているかもしれません。

 ・作成者が違うので、コードの癖が講義ごとに変わることがある。

 ・図が少ない箇所も多く、今何をやっているのかが掴みにくいことがある。

 大きくこの2点が結構多く、読めばわかるのですが、不親切だと感じていた点です。

 そのためのメンターだと思うので、私のように考え込まずにすぐ質問するのがいいと思います。ライフコーチの方にも「考え込まずに質問しましょう。」と言われておりました。

 

② 紹介は思ったよりも少ない

 30代でも転職保証がついている講座は少ないと思います。テックキャンプからの紹介はやはり条件的に厳しく、キャリアアドバイザーの方も紹介しにくいようなイメージでした。その分面接対策やら、職務経歴書指導やらをしてくれたのは助かりました。

 

 

swift ツールバーが表示されない

起動したら

f:id:mst_kb:20210610164343p:plain

こうなるはずなんだけど

下のツールバーが表示されない

 

実際に自分のiPhoneで表示させようとしてもツールバーだけ出てこない

PC上では動いているから・・・

ipadでもやってみるか

持ってるiphoneが6sで結構古いから対応できないのかもしれない。

 

ipadだと表示はされるけど

押しても反応しない。。。

 

画像が指定されたやつじゃないから行けんのかな

 

何も解決せず。。。

 

そもそもこの本とバージョンも違うし、対応不可能っぽい

 

mac上ではできているので、とりあえず次へ。

swiftを見てみる

無職生活も長く、思った通りの実装もままならぬ現状。

何を思ったかswiftに手を出し始めた。

 

変数はvar

定数はlet

 

ファイルの削除ができん

f:id:mst_kb:20210608225955p:plain

同じファイルが2つ作られちゃったから右くりっくで削除を探したんだけど右クリックでも削除がない。

 

選択してDeleteキーらしいんだけど

MacにDeleteキーなんてあったっけ

さらに検索すると

Windowsのbackspaceがそれらしい。

 

やってみたらできた。

 

解答が1つ1つ表示されるようにする

今、表示されている問題一覧を、

f:id:mst_kb:20210519202059j:plain

今は、解答に設定されているIDはすベて同じIDになってしまう。

違うIDを繰り返し文で振り分ける方法が必要か?

→そうすると、JSで作成する文も問題文の数だけ必要にならないか

同じIDでもクリックし他やつだけ反応するような処理があるのではないか

→thisでいけるらしい

function count (){
const answer_display = document.getElementById("id_answer");

answer_display.addEventListener('mouseover', function(){
this.setAttribute("style", "background-color:#FFBEDA;")
 
});
}

window.addEventListener('load', count);

うーん一問目しかいかないな

idは一つにしか振られないとかだったから、これをクラスにしたらいけるだろうか

 

function count (){
const answer_display = document.querySelectorAll(".detail-answer");

answer_display.forEach(function(answer){
answer.addEventListener('click', function(){
this.setAttribute("style", "color:red;")
 
});
});
}

window.addEventListener('load', count);

 

クラスじゃないけど、配列を使う方法でやったらできた。

 

相変わらず大したことじゃないけど

したいことができるのはとても楽しい。

検索結果を問題形式に見えるようビューを変更

検索結果後のビューを整えてみる。

f:id:mst_kb:20210519181732j:plain

まずはこんな感じ。

エクセルのような表形式で表示する。

f:id:mst_kb:20210519181931p:plain

フリマアプリ作成時、こんな感じのものが用意されていたので、

この表示を見にいけばいいかな。

えーと

ビューが

<table class="detail-table">
<tbody>
<tr>
<th class="detail-item">出品者</th>
<td class="detail-value"><%= @item.user.nickname %></td>
</tr>
<tr>
<th class="detail-item">カテゴリー</th>
<td class="detail-value"><%= @item.category.name %></td>
</tr>
<tr>
<th class="detail-item">商品の状態</th>
<td class="detail-value"><%= @item.sales_status.name %></td>
</tr>
<tr>
<th class="detail-item">タグ</th>
<td class="detail-value"><%= @item.tags.pluck(:tag_name) %></td>
</tr>
<tr>
<th class="detail-item">配送料の負担</th>
<td class="detail-value"><%= @item.shipping_fee_status.name %></td>
</tr>
<tr>
<th class="detail-item">発送元の地域</th>
<td class="detail-value"><%= @item.prefecture.name %></td>
</tr>
<tr>
<th class="detail-item">発送日の目安</th>
<td class="detail-value"><%= @item.scheduled_delivery.name %></td>
</tr>
</tbody>
</table>

こうなっている

tableってやつかな、これはまだ使ったことがない

https://www.tohoho-web.com/html/table.htm

これを参考に詰まったら見に行こう。

 

cssも見に行こう。

.detail-table {
margin-bottom: 30px;
width: 100%;
}

.detail-item {
width: 20%;
background-color: #eee;
border: 1px solid #dedede;
font-size: 14px;
text-align: center;
}

.detail-value {
width: 80%;
padding: 20px;
border: 1px solid #dedede;
font-size: 14px;
}

該当箇所はこんな感じ。

特に新しいことはやっていなそうだ

 

繰り返し文で表示しているから

f:id:mst_kb:20210519190834j:plain

こんな感じかな。

<table class="detail-table">
<div class = 'master_result', id = "master_result">
<tr><th>ページ数</th><th>問題</th><th>解答</th></tr>
<% @results = @results.shuffle %>
<div class = 'id_result', id = 'id_result'>
<% @results.each do |result| %>
<td>
<tr>
<th class="detail-page"><%= result.page %></th>
<th class="detail-question"><%= result.question %></th>
<th class="detail-answer"><%= result.answer %></th>
</tr>
<%# <%= result.difficult %>
<%# <%= result.subject %>
<% end %>
</div>
</table>

こうすると

f:id:mst_kb:20210519193143p:plain

こうなった。

基本的な表示はこれでOK。

解答はとりあえず白い字で表示しておくことに。

 

ただ、せっかく実装したid順に並び替えるがなんかうまくいかない。

tableにjavaのイベント発火元であるidを設定してもうまくいかない。

divの中にtable入るかな

 

単純にdivに指定していたidをtableに設定したらいけたいけた

コピーして貼り付けてダメだったから

切り取って貼り付けたらできたんだけど、

1つのidにしか反応しないんだろうか

多分そうだろう。

ransackによるor検索②(一旦保留)

もう全くわからんから

質問できるサイトを初めて使ってみることに

Ruby - ruby ransackを使ったor検索の実装 undefined method `negative?'の解釈|teratail

 

質問してみて次の日の朝、

返信来てたけど、

解決にはつながらない・・・

 

できそうなのにできないのはもどかしい。

特に時間に追われているわけではないから、

もう少し粘る。

 

(2日経過)

 

よくわからなすぎて進まない。

モチベーションもひどいことになってきたので、

一旦保留することに

 

違う機能の実装をすることに

そんなこんな言っているうちにテックキャンプを卒業してしまった。

 

算数で言えば足し算引き算ができるようになったくらいだって言うのに

就活は大丈夫だろうか。

テックキャンプのメンターはいまいち信用ならない行動や言動が見られる。

最低限のことはこなしておこう。

 

働かなければすぐ死んでしまう状況でもなし、

まずは、自信を持って世に出せるものを作り出せる能力を身につけたい。

 

仕事しながらでもできなくはないだろうから、

仕事探しも並行するが、

違う機能の実装も進めよう。

 

差し当たって、今のアプリは

前職のデータが残ってしまっている。

 

復讐がてら新しいのを組み直してみよう。

どうせ大したことはまだできていない。

CSVファイルのデータをseedで取り込む、検索機能の概要の実装、ransackによるor検索

問題一覧をDBに取り組む

手始めに1000問くらいあるExcelファイルを用意した。

ExcelファイルからDBにとりくむ方法を調べた。

 

https://qiita.com/mmmasuke/items/545afaf5876d3dc52670

 

このサイトの通りにCSVに保存し直してみる

 

rails aborted!

NameError: uninitialized constant CSV

/Users/kubomasato/projects/search_app/db/seeds.rb:1:in `<main>'

/Users/kubomasato/projects/search_app/bin/rails:9:in `<top (required)>'

/Users/kubomasato/projects/search_app/bin/spring:15:in `<top (required)>'

bin/rails:3:in `load'

bin/rails:3:in `<main>'

Tasks: TOP => db:seed

 

 

require "csv"

を入れ損ねていた。これを入力して再度実行

 

f:id:mst_kb:20210511152810p:plain

問題一覧の一挙登録ができた。

 

次は〜ページ以上、〜ページ未満の範囲を選択できるようにする

 

f:id:mst_kb:20210511195719j:plain

以下、以上だけであれば実装したことがあるが、今回のような範囲検索はしたことがないので、検索。

https://qiita.com/nojinoji/items/e1b174220da8c81a1756

 

このサイトが参考になりそう。

(このサイトに記載されているソート機能も覚えておきたい。前回苦戦したランダム並び替えに使えそう)

 

f:id:mst_kb:20210511214922p:plain

今のところ検索ふぉーむはこうなっている

ただこのままでは、定期テスト時に

地理は121〜150

歴史は170〜200

などというテスト範囲時にいちいち地理と歴史の問題一覧を出力する必要がある。

これでは(まだ未実装だが)印刷する際など余計な紙が出てきてしまう。

もちろん分けて出力したい人もいるだろうから、どちらもできるようにしたい。

 

f:id:mst_kb:20210511215631j:plain

 

そもそも、地理と歴史で複数の条件になる。

だから

地理で121〜150  or 歴史 170 〜200 で検索できるか。

を調べる必要がある。

だから「地理 && 121~150」||「歴史 && 170〜200」みたいな処理をしたい

 

ransackではand検索になっているはずなので

or検索をする必要がある。

「ransuck  or検索」で検索。

http://j-ogawa.hatenadiary.jp/entry/2014/03/25/000334

こちらのサイトがやりたいことと同じことをやろうとしているんだけど...

 

User.search(
  m: 'or',
  g: {
    '0' => { m: 'or', power_gteq: 100, magic_gteq: 30 },
    '1' => { m: 'and', level_gteq: 20, hp_lteq: 30 }
  }
).result

 

...見たことない記述だ?

保留にしつつ、別のサイトへ

http://nekorails.hatenablog.com/entry/2017/05/31/173925

# シンプルモード
q = {name_eq: "ほげ"}
Product.ransack(q).result.to_sql
=> "SELECT `products`.* FROM `products` WHERE `products`.`name` = 'ほげ'"

# アドバンストモード
q = {
  # conditions(条件)
  "c" => {
    "0" => {
      # attributes(属性)
      "a" => { "0" => { "name" => "name" } },
      # predicate(述語)
      "p" => "eq",
      # values(値)
      "v" => { "0" => { "value" => "ほげ" } }
    }
  }
}
Product.ransack(q).result.to_sql
=> "SELECT `products`.* FROM `products` WHERE `products`.`name` = 'ほげ'"

これだ。

アドバンストモードとやらを使っているらしい。

ビューにするとこうなるらしい。

# シンプルモード
<%= f.search_field :name_eq %>

# アドバンストモード
# conditions(条件)
<%= f.condition_fields do |c| %>

  # attributes(属性)
  <%= c.attribute_fields do |a| %>
    <%= a.attribute_select %>
  <% end %>

  # predicate(述語)
  <%= c.predicate_select %>

  # values(値)
  <%= c.value_fields do |v| %>
    <%= v.search_field :value %>
  <% end %>

<% end %>

...何がどうなっているのかさっぱりだ。

その後の解説を読んでいく。

 

今、自分の記述は

def search_product
@p = Content.ransack(params[:q]) # 検索オブジェクトを生成
end

こうなっている。

この@pに何が入っているかの解説があった。

f:id:mst_kb:20210512150838j:plain

conditionが条件で

 その中身にattribute=探すカラム

      predicate=取り出す条件

      value=入力された値

となっていることが確認できた。

 

と言うことは先ほどのやつはこうなるのか、

f:id:mst_kb:20210512152124j:plain

なるほど、今見ると、コメントアウトでしっかり書いてあったけど、このcとかaとかpとかvの意味が一応わかったぞ。

ビューファイルの方は...

f:id:mst_kb:20210512152247j:plain

うーん、この_selectって何しているんだ?

これだけでnameカラムから探すとか、eqを使うっていう意味になっていないはずなんだけど...

とりあえず、先に読み進める

 

f:id:mst_kb:20210512153809j:plain

シンプルとアドバンスで共存できるみたい。

記述がものすごく長くなりそうだからそれはいい。

or検索もできそう。

gでグループ分けするみたいだから

f:id:mst_kb:20210512154251j:plain

こんな感じにグループ分けするのかな?

科目数とかもユーザーが気軽増やせるようにしたいから後で考え直さないと

 

さて、処理的にできそうなのはいいけど、

ビューファイルの件はまだ全くわかっていないので、

続き

# シンプルモード
Product.ransack(name_eq: "ほげ", id_eq: 1).base.conditions
=> [Condition <attributes: ["name"], predicate: eq, values: ["ほげ"]>, Condition <attributes: ["id"], predicate: eq, values: [1]>]

# アドバンストモード
q = {
  "c" => {
    "0" => {
      "a" => { "0" => { "name" => "name" } },
      "p" => "eq",
      "v" => { "0" => { "value" => "ほげ" } },
    },
    "1" => {
      "a" => { "0" => { "name" => "id" } },
      "p" => "eq",
      "v" => { "0" => { "value" => 1 } },
    }
  }
}
Product.ransack(q).base.conditions
=> [Condition <attributes: ["name"], predicate: eq, values: ["ほげ"]>, Condition <attributes: ["id"], predicate: eq, values: [1]>]

c(条件)が2つ以上ある時は上のように

0,1で区切るみたい。

なるほど先ほどの

 

User.search(
  m: 'or',
  g: {
    '0' => { m: 'or', power_gteq: 100, magic_gteq: 30 },
    '1' => { m: 'and', level_gteq: 20, hp_lteq: 30 }
  }
).result

 こちら様も

グループ:0

 パワーが100以上、もしくは、マジックが30以上

グループ:1

 レベルが20以上、かつ、HPが30以下

で、グループ0もしくはグループ1になっているわけかな

 (p100↑ or m30↑) or (lv20↑ and hp30↓)

あれ、最初のなんで「or」なんだろう。andの間違いかな、

 

何しているかわかったはいいけど

やっぱりビューのほうはわかっていない

# index.html.erb

<%= search_form_for @search do |f| %>

  # conditions
  # conditionsやattributesのようにコレクションになるものに対しては、`f.condition_fields`などの`f.*_fields`を利用してね。
  # params[:q][:c]["0"]に対応するよ("0"はコレクションの連番の1つ目を表すよ。)
  <%= f.condition_fields do |c| %>

    # attributes
    # params[:q][:c]["0"][:a]に対応するよ。
    <%= c.attribute_fields do |a| %>
      # 属性のセレクトボックスだよ。
      # `id`などの全ての属性が選択可能だよ。
      # params[:q][:c]["0"][:a]["0"][:name]に対応するよ。
      <%= a.attribute_select %>
    <% end %>

    # predicate
    # 述語のセレクトボックスだよ。
    # `eq`などの全ての述語が選択可能だよ。
    # params[:q][:c]["0"][:p]に対応するよ。
    <%= c.predicate_select %>

    # values
    # params[:q][:c]["0"][:v]に対応するよ。
    <%= c.value_fields do |v| %>
      # 値のサーチフィールドだよ。
      # params[:q][:c]["0"][:v]["0"]["value"]に対応するよ。
      <%= v.search_field :value %>
    <% end %>

  <% end %>

  <%= f.submit %>
<% end %>

・・・セレクトボックスやサーチフィールドになるのはいいんだけど、そのほかの記述方法が書いていないのかな。

とりあえずいじってみるか

<%= search_form_for @p, url: products_search_path do |f| %>
<%= f.label :question_cont, '問題文検索' %>
<%= f.search_field :question_cont, class:"items-search-text", placeholder:"問題文に含まれている文字を検索" %>
<br>

今、最初の問題文検索はこうなっているから、

同じようにして表示されるかどうかやってみよう。

<%= search_form_for @p, url: products_search_path do |f| %>
<%# conditions %>
<%= f.condition_fields do |c| %>
<%# attributes %>
<%# <%= c.attribute_fieldsd do |a| %>
<%= a.attribute :question %>
<%# <% end %>
<%# predicate %>
<%= c.predicate :_cont %>
<%# values %>
<%= c.value_fields do |v| %>
<%= v.search_field :value %>
<% end %>
<% end %>
 

・・・まあでないよね。

でもエラーすら吐かないのはなんでだろう。

なーんも表示されないのもなんでだろう。

# products_controller.rb

def index
  @search = Product.ransack(params[:q])
  # 初期状態の@searchはconditionsが空配列なので、1つだけ初期状態のconditionを作っておくよ。
  # これをやっておかないと、`f.condition_fields`で処理すべきconditionが1つもなくて、画面に何も表示されないよ。
  # 検索した場合はparams[:q]からconditionを作成するから、`@search.conditions`が`empty?`の場合だけ作るようにしてね。
  @search.build_condition if @search.conditions.empty?
  @products = @search.result
end

これをやっていなかったのでやってみる。

 

そうすると、ちゃんとエラーをはいてくれた。

 

とりあえずお手本通りに

<%= f.label :question_cont, '問題文検索' %>
<%= f.condition_fields do |c| %>
<%= c.attribute_fields do |a| %>
<%= a.attribute_select %>
<% end %>

<%= c.predicate_select %>

<%= c.value_fields do |v| %>
<%= v.search_field :value %>
<% end %>

<% end %>

こうする。

 

 

gyazo.com

こうなる。

うん、お手本通り、

そうしたら、

conditionと

attributeは固定でいい。

 

固定の仕方を調べてみたけど

<%= f.condition_fields do |c| %>
<%= c.attribute_fields do |a| %>
<%= a.hidden_field :name, value: :question %>
<% end %>

<%= c.hidden_field :p, value: "cont" %>

<%= c.value_fields do |v| %>
<%= v.search_field :value %>
<% end %>
<% end %>

こうしたら

f.search_field :question_cont

これと同じことができた。

classとかplaceholderはどこにつけるんだ?

よくわからんから、今思いつく作業である

<%= f.label :question_cont, '問題文検索' %>
<%= f.search_field :question_cont, class:"items-search-text", placeholder:"問題文に含まれている文字を検索" %>
<%= f.label :answer_cont, '解答検索' %>
<%= f.search_field :answer_cont, class:"items-search-text", placeholder:"解答に含まれている文字を検索" %>
<%= f.label :subject_eq, '科目:' %>
<%= f.collection_select :subject_eq, @product_subject, :subject, :subject, include_blank: '指定なし'%>
<%= f.label :page, 'ページ:' %>
<%= f.number_field :page_gteq %>
<%= f.number_field :page_lt %>

これをアドバンストに対応したものに変えてみる

<%= search_form_for @p, url: products_search_path do |f| %>
<%= f.label :question_cont, '問題文検索' %>
<%= f.condition_fields do |c| %>
<%= c.attribute_fields do |a| %>
<%= a.hidden_field :name, value: :question %>
<% end %>
<%= c.hidden_field :p, value: "cont" %>
<%= c.value_fields do |v| %>
<%= v.search_field :value %>
<% end %>
<% end %>
<br>
<%= f.label :question_cont, '解答検索' %>
<%= f.condition_fields do |c| %>
<%= c.attribute_fields do |a| %>
<%= a.hidden_field :name, value: :answer %>
<% end %>
<%= c.hidden_field :p, value: "cont" %>
<%= c.value_fields do |v| %>
<%= v.search_field :value %>
<% end %>
<% end %>
<br>
<%= f.label :subject_eq, '科目:' %>
<%= f.condition_fields do |c| %>
<%= c.attribute_fields do |a| %>
<%= a.hidden_field :name, value: :subject %>
<% end %>
<%= c.hidden_field :p, value: "eq" %>
<%= c.value_fields do |v| %>
<%= v.collection_select :value, @product_subject, :subject, :subject %>
<% end %>
<% end %>
<%= f.label :page, 'ページ:' %>
<%= f.condition_fields do |c| %>
<%= c.attribute_fields do |a| %>
<%= a.hidden_field :name, value: :page %>
<% end %>
<%= c.hidden_field :p, value: "qteq" %>
<%= c.value_fields do |v| %>
<%= v.search_field :value %>
<% end %>
<% end %>
から
<%= f.condition_fields do |c| %>
<%= c.attribute_fields do |a| %>
<%= a.hidden_field :name, value: :page %>
<% end %>
<%= c.hidden_field :p, value: "lt" %>
<%= c.value_fields do |v| %>
<%= v.search_field :value %>
<% end %>
<% end %>
まで

こうしてみた。

みてくれはこうなる。

gyazo.com

相変わらずplaceholderがわからんけど、

本題を先に片付けていこう。

 

ここで、

現段階での検査構造を整理してみる

f:id:mst_kb:20210513150247j:plain

こうかな。

ここから、アドバンストに対応した記述に

グルーピングしていけばいいはず。

<%= search_form_for @p, url: products_search_path do |f| %>
<%# グループ1 問題文、解答検索 %>
<%= f.grouping_fields do |g| %>
<%= g.label :question_cont, '問題文検索' %>
<%= g.condition_fields do |c| %>
<%= c.attribute_fields do |a| %>
<%= a.hidden_field :name, value: :question %>
<% end %>
<%= c.hidden_field :p, value: "cont" %>
<%= c.value_fields do |v| %>
<%= v.search_field :value %>
<% end %>
<% end %>
<br>
<%# 解答 %>
<%= g.label :question_cont, '解答検索' %>
<%= g.condition_fields do |c| %>
<%= c.attribute_fields do |a| %>
<%= a.hidden_field :name, value: :answer %>
<% end %>
<%= c.hidden_field :p, value: "cont" %>
<%= c.value_fields do |v| %>
<%= v.search_field :value %>
<% end %>
<% end %>
<% end %>
<br>
<%# グループ2 科目ごと %>
<%= f.grouping_fields do |g| %>
<%# グループ2-1 地理 %>
<%= g.grouping_fields do |g1| %>
<%= g1.label :subject_eq, '科目:' %>
<%= g1.condition_fields do |c| %>
<%= c.attribute_fields do |a| %>
<%= a.hidden_field :name, value: :subject %>
<% end %>
<%= c.hidden_field :p, value: "eq" %>
<%= c.value_fields do |v| %>
<%= v.collection_select :value, @product_subject, :subject, :subject %>
<% end %>
<% end %>
<%= g1.label :page, 'ページ:' %>
<%= g1.condition_fields do |c| %>
<%= c.attribute_fields do |a| %>
<%= a.hidden_field :name, value: :page %>
<% end %>
<%= c.hidden_field :p, value: "qteq" %>
<%= c.value_fields do |v| %>
<%= v.search_field :value %>
<% end %>
<% end %>
から
<%= g1.condition_fields do |c| %>
<%= c.attribute_fields do |a| %>
<%= a.hidden_field :name, value: :page %>
<% end %>
<%= c.hidden_field :p, value: "lt" %>
<%= c.value_fields do |v| %>
<%= v.search_field :value %>
<% end %>
<% end %>
まで
<% end %>
<br>
<%# グループ2-2 歴史 %>
<%= g.grouping_fields do |g1| %>
<%= g1.label :subject_eq, '科目:' %>
<%= g1.condition_fields do |c| %>
<%= c.attribute_fields do |a| %>
<%= a.hidden_field :name, value: :subject %>
<% end %>
<%= c.hidden_field :p, value: "eq" %>
<%= c.value_fields do |v| %>
<%= v.collection_select :value, @product_subject, :subject, :subject %>
<% end %>
<% end %>
<%= g1.label :page, 'ページ:' %>
<%= g1.condition_fields do |c| %>
<%= c.attribute_fields do |a| %>
<%= a.hidden_field :name, value: :page %>
<% end %>
<%= c.hidden_field :p, value: "qteq" %>
<%= c.value_fields do |v| %>
<%= v.search_field :value %>
<% end %>
<% end %>
から
<%= g1.condition_fields do |c| %>
<%= c.attribute_fields do |a| %>
<%= a.hidden_field :name, value: :page %>
<% end %>
<%= c.hidden_field :p, value: "lt" %>
<%= c.value_fields do |v| %>
<%= v.search_field :value %>
<% end %>
<% end %>
まで
<% end %>
<br>
<%# グループ2-3 公民 %>
<%= g.grouping_fields do |g1| %>
<%= g1.label :subject_eq, '科目:' %>
<%= g1.condition_fields do |c| %>
<%= c.attribute_fields do |a| %>
<%= a.hidden_field :name, value: :subject %>
<% end %>
<%= c.hidden_field :p, value: "eq" %>
<%= c.value_fields do |v| %>
<%= v.collection_select :value, @product_subject, :subject, :subject %>
<% end %>
<% end %>
<%= g1.label :page, 'ページ:' %>
<%= g1.condition_fields do |c| %>
<%= c.attribute_fields do |a| %>
<%= a.hidden_field :name, value: :page %>
<% end %>
<%= c.hidden_field :p, value: "qteq" %>
<%= c.value_fields do |v| %>
<%= v.search_field :value %>
<% end %>
<% end %>
から
<%= g1.condition_fields do |c| %>
<%= c.attribute_fields do |a| %>
<%= a.hidden_field :name, value: :page %>
<% end %>
<%= c.hidden_field :p, value: "lt" %>
<%= c.value_fields do |v| %>
<%= v.search_field :value %>
<% end %>
<% end %>
まで
<% end %>
<%# グループ2のOR検索の設定 %>
<%# <%= g.hidden_select :m, value: "or"%>
<%= g.hidden_field :m, value: "or" %>
<% end %>

なんだこの長さは・・・でもビューは

gyazo.com

良さそうだ

検索してみる

gyazo.com

できているといいなあ

ああ、エラーだあ

gyazo.com

なんだあこれは・・・

negativeが定義されていない?

どういうことだあ・・・