bundle installした時のwith native extensionsってなんだ?

こんにちは!kossyです!




さて、今回はbundle installした時のログに現れるwith native extensionsの意味について、
ブログに残してみたいと思います。




C言語C++で書かれているライブラリが必要

gemの中には、ruby以外の言語に依存しているものもあり、
そういった依存関係のあるものをインストールする場合に、
表示されるらしいです。


native extenstionである部分を含むgemをインストールする場合は、
CやC++で書かれたライブラリを別途gemのインストール先にインストールしておく必要がある。

ネイティブ(CやC++で書かれた)ライブラリにRubyで書かれたgemが依存してるのであって、
ネイティブライブラリがRubyのgemに依存しているわけではない。

参考: Rubyのgemをインストールしている際に他のライブラリのインストールを要求してくるnative extensionとは何者か - woshidan's loose leaf


また一つ賢くなりました。

(最近内容の薄いブログで申し訳ありません)

冗長な検索ロジックはscopeにしちゃおう

こんにちは!kossyです!



さて、今回はRailsで独自にモデルのデータの絞り込みを定義できるscopeについて、
ブログに残してみたいと思います。




環境
Rails 5.1.6
Ruby 2.5.1
MacOS Mojave




実装方法



例えば、「公開が終了した映画の中で原作が漫画でないデータをidが古い順に取りたい」をモデルから絞り込みをするとします。
これをコードに落とし込むと、

@movies = Movie.where(status: :end).where_not(original_work: :comic).order(id)

ってな感じになるかと思うのですが、これをscopeで定義できまして、

class Movie < ApplicationRecord
  scope :not_comic_end_movie, -> { where(status: :end).where_not(original_work: :comic).order(id) } 
end

って感じで定義できます。scopeとして定義すると、

@movies = Movie.not_comic_end_movie

とするだけで、

  @movies = Movie.where(status: :end).where_not(original_work: :comic).order(id)

とした時と同じレコードを取得することができます。

同じような検索を何度も行うような時や、記述が冗長になってしまった時に有効な手段だと思います。

bundle installする時はパスの指定をしよう

こんにちは!kossyです!




さて、今回はbundle installする時の注意事項について、ブログに残してみたいと思います。




bundle installする時はpathを指定しよう

普段Gemfileを編集すると、
bundle installを実行すると思うのですが、

    • path vendor/bundleでパスの指定をしたほうが良いです。

理由は、


gemを任意のディレクトリにインストールし、gemをRailsプロジェクト毎に管理するためです。
ディレクトリを指定しないbundle installはシステム領域にインストールされるため、複数のrailsアプリを同一のマシン上で運用していると、問題が発生することがあります。
vendor/bundleは、アプリ専用の領域のため、他のアプリには影響がありません。

マシン上で、一つしかrailsアプリを動かさないのであれば、システム領域に入れてしまっても問題ないでしょう。

参考:
Ruby - bundle install するときになぜ vendor/bundle に入れるのか|teratail

とのことでした。


bundle install する時は余計なバグを生まないためにも
パスを指定するようにしましょう。