質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Active Record

Active Recordは、一つのオブジェクトに対しドメインのロジックとストレージの抽象性を結合するデザインパターンです。

Q&A

1回答

2908閲覧

attr_accessorとActiverecordのselect

TakuhiroFuji

総合スコア10

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Active Record

Active Recordは、一つのオブジェクトに対しドメインのロジックとストレージの抽象性を結合するデザインパターンです。

0グッド

1クリップ

投稿2016/05/14 05:15

編集2016/05/15 03:58

###Activerecordの不自然な動作

Activerecordでちょっと不自然な動作を見つけたのですが、ググっても
あまり問題になっていないので皆さんどう思っているのか、どうしているのか聞いてみたくなりました。

例えば以下のようなモデルを作成します

class App < ActiveRecord::Base attr_accessor :hoge end

前提としてhogeはデータベースに持っていないカラムで、
mogeはデータベースに持っているカラムです。
以下のようなコードでは、mogeが1で取得されますが

App.select("1 AS moge").where(:id => 1).first.moge

以下の場合はhogeがnilになりました。

App.select("1 AS hoge").where(:app_id => 1).first.hoge

どうやらデータベースのカラムで持っていなくて、attr_accessorにある場合は
クエリの結果で上書きするのではなく、このインスタンスのhogeにアクセスしているらしく
nilになってしまいました。

この場合、hogeを保存するには以下のようにしないといけないのでしょうか?

row = App.select("1 AS hoge").where(:app_id => 1).first row = App.new(row.attributes.compact)

普通に考えてクエリの結果の方を優先して欲しいのですが、そのような動作になってないようです。。

ちなみにバージョンはRails 4.1.4、ruby 2.1.2p95です。

###補足

App.select("1 AS hoge").where(:app_id => 1).first[:hoge]

で取得しろってことですかねえ。。

カラムhogehogeがある場合

App.select("1234 AS hogehoge").where(:app_id => 1).first[:hogehoge]

でも

App.select("1234 AS hogehoge").where(:app_id => 1).first.hogehoge

でも1234になるのに。。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

見る限り不自然には見えません。
と言うのも、事前にデータベースのカラム名が繋がっているhogeメソッドに対して attr_accessor でhogeを再定義しているので、繋がりを打ち消しています。

単純にhogeをDBに保存したいのであれば、すでにアクセッサの機能を持っているので、attr_accessorを取ってしまったほうが良いかと思います。

投稿2016/05/15 01:52

miyamiya

総合スコア691

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TakuhiroFuji

2016/05/15 03:54

すいません、説明が抜けていました。hogeはデータベースのカラムとして持っていない値です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問