結論
DISTINCT
を使います。
SELECT COUNT(DISTINCT name) FROM users
COUNTの箇所はAVG(平均)、SUM(合計)なども充てることが出来ます。
これはtypoに見せかけて、プロジェクト内では列記とした単語なんじゃ!という場合。 毎回警告が出るとうざいですよね。
該当ワードで右クリック すると、Spellingという項目が出てきます(自分の場合は、トップに出てきました)
さらに「Spelling」> 「Save '該当ワード' to project-level directory」を選択
波線と警告がなくなりました!!めでたし!
普段自分が触れる情報の鮮度を上げたいと思った。
普段は業務でRubyを使っているが、多言語に対応して一丁前のエンジニアになるべく、Goの学習をしてみる(週末限定)
このサイトが非常に役に立った。
自分はMacを使用しているため、homebrewでGoをインストールする。
$ brew install go
これで完了!
bash_profile(又は、bashrc)に環境変数を記述する。
export GOROOT=$HOME/go
GOPATHの指定としては、選択肢として、①ルートディレクトリ配下②home以下にgoディレクトリを作成 の2パターンがありそうです。
参考
適当なファイルを生成し、下記の内容を記述する。
今回はhello.goというファイルを作成。
package main import "fmt" func main(){ fmt.Printf("Hello, World!\n") }
続いて、チェックを行う。 下記コマンドと期待する出力が得られれば完了!
$ go version go version go1.12 darwin/amd64 $ go run hello.go Hello, World!
Goの学習用にA Tour of Go
というサイトが設けられています。
インタラクティブに学習を進められるので、環境構築前に触りたい人にオススメです。
プロジェクトメンバーにエンジニア以外の関係者がいるときに、テーブル定義書を用意することになった。
下記を参考にrakeタスクを作成する。
lib/tasks内にrakeタスクを作成する。
lib/tasks/dbdoc.rake
def get_schema_info(klass) table = Table.new table.name = klass.table_name table.columns = [] table.indexes = [] table.comment = klass.connection.retrieve_table_comment(klass.table_name) if defined? MigrationComments # 省略 end
ここで、klass(つまりmodels配下の*.rbファイル)とデータベースの整合性が合わない場合に、table_name
でNo Method Errorが発生した。
確認してみると、google_place.rb
というGoogleMap用に設けていたモデルファイルが存在していた。
また、appliaction_record.rb
というファイルについては、klassがnilで返ってきた。
そのため、もともとの配列から削除してあげることにした。
task dbdoc: :environment do klasses = Dir["app/models/**/*.rb"]. reject{|f| f["concerns/"] }. reject{|f| f["app/models/google_place.rb"]}. # 追加 reject{|f| f["app/models/application_record.rb"]}. # 追加 map{|f| f.gsub(/^app\/models\/(.+?)\.rb$/, '\1') }. map{|m| ActiveSupport::Inflector.camelize(m) }. map{|k| ActiveSupport::Inflector.constantize(k) } datum = klasses.map{|k| get_schema_info(k) } # 省略 end
これで綺麗なklassesの配列が出来上がった。
datum内を覗いてみると、
=> [#<struct Table name="hoge_table_names", comment=nil, columns= [#<struct Column name="id", type="bigint(20)", not_null=false, default=nil, primary_key=true, comment=nil>, #<struct Column name="hoge_id", type="int(11)", not_null=true, default=nil, primary_key=false, comment=nil>, #<struct Column name="huga_id", type="int(11)", not_null=true, default=nil, primary_key=false, comment=nil>, #<struct Column name="created_at", type="datetime", not_null=false, default=nil, primary_key=false, comment=nil>, #<struct Column name="updated_at", type="datetime", not_null=false, default=nil, primary_key=false, comment=nil>], indexes=[]>, #<struct Table name="contract_plans", comment=nil, columns=....
というような配列が返ってきた(良い感じ)
安堵していたのも束の間、別のエラーが発生した。
rake aborted! NameError: uninitialized constant Axlsx
何やら不明なAxlsx
があるらしい。
AxlsxはExcelファイルの出力用に用いるらしい。
これを参考にした。
GemfileにExcelファイルを扱うためのGemを導入した。
gem 'axlsx' gem 'zip-zip'
gem 'zip-zip'を含めないと、axlsxとの依存関係によりエラーが発生します。
rakeタスクを実行してみます。
$ bundle exec rake dbdoc:dbdoc
これで、xslx
の拡張子付きのテーブル定義書が発行されました〜
こちらの記事は現場でRuby on Railsを用いている筆者が、独断と偏見でRailsのTipsをまとめたサイトを収集する記事です。
基本的に「まとめのまとめ」のスタンスを取ります。
つまり、私の備忘録です。
一発目から海外の英語記事ですが()
インスタンス変数とは、オブジェクトが抱えている変数のこと。
例えば下記のようなrubyファイルにUserクラスがあったとする。
class User end
ここで、rubyのセッターとゲッターという概念が登場する。
class User def name=(name) @name = name end def name @name end end
irbを起動して動作を確認してみる
$ irb irb(main):001:0> require './user.rb' => true irb(main):002:0> user = User.new => #<User:0x00007fc32d1cf3e8> irb(main):003:0> user.name = 'hoge' => "hoge" irb(main):004:0> user.name => "hoge"
hogeという値をuserオブジェクトのnameに代入しました。 ここで、userオブジェクトの中身を確認してみます。
irb(main):005:0> user => #<User:0x00007ffd56056d50 @name="hoge">
userオブジェクトが「hoge」を抱えている様子がわかりますね。 このuserオブジェクトが抱えているnameを 属性(Attribute) と呼ぶことがあります。
実は、このゲッターやセッターはもっと簡略化して記述することが可能です。 それは、attr_accessorというメソッドによって実現されます。
先程のコードを例に出すと、下記のように記述可能です。
class User attr_accessor :name end
とても簡単ですね!!👏
Webサービスに当てはめると、Userが持つ情報は、name以外にあるはずです。 例えば、メールアドレスや性別などがあります。
このときに、先程のattr_accessorで複数個の属性を定義することができます。
class User attr_accessor :name, :email, :sex end
$ irb / 省略 irb(main):002:0> user = User.new => #<User:0x00007f9936342cc8> irb(main):003:0> user.name = "Mario" => "Mario" irb(main):004:0> user.email = "test@sample.com" => "test@sample.com" irb(main):005:0> user.sex = "male" => "male" irb(main):006:0> user => #<User:0x00007f9936342cc8 @name="Mario", @email="test@sample.com", @sex="male">
こうして、userオブジェクトに複数個の属性を定義することができました。