{"id":21285604,"url":"https://github.com/takeyuweb/meta_field","last_synced_at":"2025-07-04T16:33:41.946Z","repository":{"id":4603802,"uuid":"5746974","full_name":"takeyuweb/meta_field","owner":"takeyuweb","description":"ActiveRecord meta_field for Rails 3","archived":false,"fork":false,"pushed_at":"2013-03-28T15:34:47.000Z","size":144,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-03-15T15:13:13.438Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Ruby","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/takeyuweb.png","metadata":{"files":{"readme":"README.rdoc","changelog":null,"contributing":null,"funding":null,"license":"MIT-LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2012-09-10T08:51:21.000Z","updated_at":"2014-07-09T05:21:02.000Z","dependencies_parsed_at":"2022-08-31T20:42:40.076Z","dependency_job_id":null,"html_url":"https://github.com/takeyuweb/meta_field","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/takeyuweb/meta_field","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/takeyuweb%2Fmeta_field","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/takeyuweb%2Fmeta_field/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/takeyuweb%2Fmeta_field/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/takeyuweb%2Fmeta_field/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/takeyuweb","download_url":"https://codeload.github.com/takeyuweb/meta_field/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/takeyuweb%2Fmeta_field/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":263577245,"owners_count":23483130,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-21T11:21:26.584Z","updated_at":"2025-07-04T16:33:41.923Z","avatar_url":"https://github.com/takeyuweb.png","language":"Ruby","funding_links":[],"categories":[],"sub_categories":[],"readme":"= MetaField\n\nAuthor:: Yuichi Takeuchi uzuki05@takeyu-web.com\nWebsite:: http://takeyu-web.com/\nCopyright:: Copyright 2012 Yuichi Takeuchi\nLicense:: MIT-LICENSE.\n\nもっと柔軟にメタデータを付けたい。いちいちカラムを増やしたくない。\n\n== Installation\n\n  # your Gemfile\n  gem 'meta_field'\n\n=== Post Instration\n\n  $ rails g meta_field:migration\n  $ rake db:migrate\n\n== Usage\n\n=== メタ属性の定義\n\nモデルクラスで meta_field を宣言します。\n\n  class Book \u003c ActiveRecord::Base\n    meta_field :released_at, :datetime\n    meta_attr :page, :integer, index: false # meta_attr は meta_field の別名\n    meta_field :note, :text, default: '(none)'\n  end\n\nSTIを使うこともできます。親のメタ属性は子でも使用できます。\n\n  class Animal \u003c ActiveRecord::Base\n    meta_field :name, :string\n  end\n\n  class Dog \u003c Animal\n    meta_field :pedigree\n  end\n\n  class Cat \u003c Animal\n  end\n\n=== メタ属性の使用\n\n宣言した属性名のsetter/getterが提供されます。\n\n  animal.name #=\u003e nil\n  animal.name = \"Pochi\"\n  animal.name #=\u003e \"Pochi\"\n  animal.save\n  Animal.find(animal.id).name #=\u003e \"Pochi\"\n\n=== メタ属性による検索\n\nmeta_joinスコープを利用できます。\n\nmeta_joinを使うと、メタ属性を使って検索したり並び替えたりするためのサブクエリがJOINされます。\n\n  # released_atの降順でソート\n  Book.meta_join(:released_at).order('released_at DESC')\n  \n  # priceの昇順、同一の場合はreleased_atの降順でソート\n  Book.meta_join(:released_at, :price).order('price ASC, released_at DESC')\n\n  # priceで検索\n  Book.meta_join(:price).where(Arel.sql('price BETWEEN 1000 AND 2000')).order('price ASC')\n  # メタ属性でない通常の属性と組み合わせた検索もできます。\n  Book.meta_join(:price).where(t.arel_table[:hoge].matches('%HOGE%').and(Arel.sql('price BETWEEN 1000 AND 2000'))).order('price ASC')\n\nJOIN対象を少なくするために、JOINの前に検索しておきたい場合は、 .meta_join に、属性名をキーに、検索条件を値とするハッシュを渡します。\n\n  # released_atが1年前より新しものを検索しからJOINし、価格の昇順でソート\n  Book.meta_join(:released_at: Book.meta[:released_at].gt(1.years.ago)).meta_join(:price).order(:price)\n  # または、検索条件無し=nilとして\n  Book.meta_join(:released_at: Book.meta[:released_at].gt(1.years.ago), price: nil).order(:price)\n\n.meta[:released_at] は、メタ属性で検索を行う場合に、そのままではメタ属性の型毎に別々のカラムに入っていたり非常に扱いにくいため、これを緩和するプロキシオブジェクトを返します。\n.meta_join内で、Arelを使った条件組み立てを行う際に、.arel_table[:hoge]と同じ感じで使用します。\n\n\n== 関連先モデルのメタ属性による検索\n\nサブクエリのJOINを使用して下さい。\n\n  # 21歳から39歳の著者の本を出版日の降順で取り出す\n  # 「21歳から39歳の著者」を検索するサブクエリ組み立て\n  books_table = Book.arel_table\n  selected_authors_table = Author.meta_join(age: Author.meta[:age].gt(20).and(Author.meta[:age].lt(40))).arel.as('selected_authors')\n  # JOINして、「出版日の降順」のSQLを組み立てる\n  sql = Book.meta_join(:released_at).arel\n    .join(selected_authors_table, Arel::Nodes::InnerJoin)\n    .on(books_table[:author_id].eq(selected_authors_table[:id]))\n    .order('released_at DESC').to_sql\n  # 検索実行\n  books = Book.find_by_sql(sql)\n\n\n== インデックスの使用\n\n検索のためのINDEXは、デフォルトで値に対して使用されます。（:text / :binary を除く）\n検索が不要なメタ属性は index: false とすることで、明示的にインデックスの使用をキャンセルできます。\n\n\n== 型などの変更\n\n型ごとに別々のカラムにデータが格納されるため、途中から型を変更すると、変更前の値を取得できなくなります。（未設定扱いになります）\n\nインデックスを使用する属性と使用しない属性では、利用されるカラムが異なるため、途中からインデックスの使用・不使用を変更した場合も同様です。\n\n\n== 注意\n\n- 仕様変更があっても泣かない。\n\n- バグっても泣かない。\n\n- 何が起きても責任はとれません。\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftakeyuweb%2Fmeta_field","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftakeyuweb%2Fmeta_field","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftakeyuweb%2Fmeta_field/lists"}