Deleted articles cannot be recovered. Draft of this article would be also deleted. Are you sure you want to delete this article?
user = User.find(:first) user.id # 1 user.name # test clone_user = user.clone dup_user = user.dup # clone したオブジェクトは ID が含まれない clone_user.id # nil dup_user.id # 1 # clone したオブジェクトは new_record? == true user.new_record? # nil clone_user.new_record? # true dup_user.new_record? # nil # dup で複製したオブジェクトは複製元オブジェクトの属性値を変更すると値が変わる user.name = 'new name' clone_user.name # test dup_user.name # new name 上記のような
Help us understand the problem. What is going on with this article? Rails3.2からRails4.2に上げたらActiveRecordが遅くなったので、どうやって調査して、どのように対処したかを語ってみたい。 とても長いので、ダルい人は最初と最後だけ読めばよいです。 TL;DR 環境: Ruby 2.1.5 ARオブジェクトを大量に(ざっくり750kくらい)loadするバッチ処理 3.2系での実行時間は約480sec、 4.2系では約2900sec 約6倍の性能劣化 原因: preloadで性能劣化してた CollectionProxyの生成周りで遅くなってた Rails4からARオブジェクトの1attribute毎にObject生成するので遅い GCの時間も増えた 調査方法: Githubのcommit、Issueを
MySQLのAES_ENCRYPT/AES_DECRYPT互換の方式でActiveRecordの属性を透過的に暗号化/復号するRubyMySQLActiveRecord Ruby on Rails (DBはMySQL) で開発をしている某案件で 運用の都合上、アプリ外から SQL でデータベースの内容を直接参照できる必要があるので、センシティブなデータは AES_ENCRYPT 関数で暗号化して、アプリ以外からも復号できるようにすること という要件がありました。 単に暗号化すればいいだけなら attr_encrypted gem などを使って透過的に Ruby 側で暗号化/復号すれば楽に実装できますが、いちいち MySQL 側で AES_ENCRYPT/AES_DECRYPT させるとなると、かなり実装が面倒です。 そこで、Ruby 側で MySQL の AES_ENCRYPT/AES_D
column_names()というメソッドがActiveRecord::Baseに用意されているので、それを使います。 ModelClass.column_names というように呼べば、カラム名の配列が取得されます。 もちろん「created_at」などRailsが勝手に作ったカラムも入っています。 === 何かやりたいことがあったとき、 http://api.rubyonrails.org/ にアクセスしてそれっぽいキーワードで検索すると、たいていそれっぽい名前のメソッドが定義されてますね。 今回も「rails カラム名一覧」などでググッたのですが出てこず(´・ω・`)、 apiリファレンス相手に「column_namesとかありそうじゃない?(*´ω`*)」 って検索したら出てきました。類推しやすいシステムって素敵、Railsって素敵。
3 ways to do eager loading (preloading) in Rails 3, 4, 5 and 6 … and check why 5600+ Rails engineers read also this 3 ways to do eager loading (preloading) in Rails 3, 4, 5 and 6 You are probably already familiar with the method #includes for eager loading data from database if you are using Rails and ActiveRecord. But do you know why you someties get few small and nice SQL queries and sometimes o
更新情報: 2013/11/19: 初版公開 2021/01/08: 訳文見直し、追記 こんにちは、hachi8833です。今回は、自分が知りたかった、Active Recordモデルのリファクタリングに関する記事を翻訳いたしました。1年前の記事なのでRails 3が前提ですが、Rails 4以降でも基本的には変わらないと思います。リンクは可能なものについては日本語のものに置き換えています。 なお、ここでご紹介したオブジェクトは、app以下にそれぞれ以下のようにフォルダを追加してそこに配置します。 注記: 以下は使われそうなフォルダを列挙しただけであり、実際にはこの一部しか使いません。 Value Object Service Object Form Object Query Object View Object Policy Object Decorator ⚓ 肥大化したActive
Google+ボタン はてなブックマークボタン 更新日時: 2013年10月24日(木) 作成日時: 2013年02月06日(水) 前の記事 / 次の記事 Railsでモデルを保存する時に、 accepts_nested_attributes_for を使ってアソシエーション先のモデルも含めて一発で保存する。 目次 やりたいこと やること 付随する機能 参考ページ やりたいこと 例えば、次のようなモデルがあって、 class Book < ActiveRecord::Base attr_accessible :author_id, :title belongs_to :author end class Author < ActiveRecord::Base attr_accessible :name has_many :books end BookとAuthorを同時に保存したい時、こう書
Rails4では、ActiveRecord周りの書き方に何点か変更が入っています。 普通にWebアプリを作る際には、もっともわかりやすい変更点の1つですね。 ActiveRecord::Modelのinclude 従来、モデルを定義するには class User < ActiveRecord::Base end としていました。 Rails4では、 class User include ActiveRecord::Model end という書き方ができます。別クラスを継承させることができるのが大きなメリットです。 影響範囲が広く(ActiveRecord::Baseを拡張するライブラリが多いため)、ひょっとしたら4.1などで更に方針が変わる可能性もありますが、ActiveRecord::Baseに依存した書き方をしないように気をつける必要があります。 find_by_*の廃止 find_b
ActiveRecordには便利なprevious_changesというメソッドがあります。 割と知名度が低いので、ここで使い方をご紹介します。 (08/26追記) はてブでご指摘(?)頂きましたが、正確にはActiveRecordではなくActiveModel::Dirtyの機能です。 まずはchanges previous_changesの前に基本のchangesです。 これは、saveする前に変更されたattributeを調べる機能です。 まずはfindした直後です。changed?は当然falseになります。 User.create(name: "Taro") user = User.find(1) user.changed? # => false user.changed [] user.changes # => {} user.changed_attributes # => {
I have a rails project running that defines the standard production:, :development and :test DB-connections in config/database.yml In addition I have a quiz_development: and quiz_production: definition pointing to a differnet host/db/user/password My goal now is to define a Migration that uses "quiz_#{RAILS_ENV}`" as its database configuration. What I have tried (and failed): Setting ActiveRecord:
平素よりQA@ITをご利用いただき、誠にありがとうございます。 QA@ITは「質問や回答を『共有』し『編集』していくことでベストなQAを蓄積できる、ITエンジニアのための問題解決コミュニティー」として約7年間運営をしてきました。これまでサービスを続けることができたのは、QA@ITのコンセプトに共感をいただき、適切な質問や回答をお寄せいただいた皆さまのご支援があったからこそと考えております。重ねて御礼申し上げます。 しかしながら、エンジニアの情報入手方法の多様化やQAサービス市場の状況、@ITの今後のメディア運営方針などを検討した結果、2020年2月28日(金)15:00をもちましてQA@ITのサービスを終了することにしました。 これまでご利用をいただきました皆さまには残念なお知らせとなり、誠に心苦しく思っております。何とぞ、ご理解をいただけますと幸いです。 QA@ITの7年間で皆さまの知識
class User < ActiveRecord::Base scope :male, ->{ where(sex: :male) } # 男性 scope :female, ->{ where(sex: :female) } # 女性 scope :adult, ->{ where(arel_table[:age].gteq 20) } # 成人 scope :minor, ->{ where(arel_table[:age].lt 20) } # 未成年 scope :men, ->{ adult.male } # 成人,男性 scope :women, ->{ adult.female } # 成人,女性 scope :boys, ->{ minor.male } # 未成年,男性 scope :girls, ->{ minor.female } # 未成年,女性 end User
class MyBaseRecord < ActiveRecord::Base end ってクラスを作って class Hoge < MyBaseRecord end ってやって動かしてみたら、"my_base_records"ってテーブルがねーぞゴルァって怒られた。調べて見ると、 ここで、 self.abstract_class = true としているのは、TypoModel が抽象クラスで、対応するテーブルが存在しないことを指定するためです。この記述がないと、「typo_models なんてテーブルはないぞ」というエラーが出ます。 ということが分かった。早速、 class MyBaseRecord < ActiveRecord::Base self.abstract_class = true end とすると、上手くいった。ふむふむ。
joinsと組み合わせて使うと関連モデルのスコープが利用できるようになる優れもの。 コード例を見るとわかりやすい。 以下は日記と日記にぶら下がるコメントのモデルを表す class Diary < ActiveRecord::Base has_many :comments scope :title_like, lambda {|title|where('title LIKE ?', "%#{title}%")} end class Comment < ActiveRecord::Base belongs_to :diary end この時Commentに対し、親のDiaryのtitleで検索をしたい場合、mergeを使わないと例えば以下のようにる。 class Comment < ActiveRecord::Base belongs_to :diary scope :diary_title_
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く