2016-11-24 7 views
0

2つのフィールドの値が等しくないレコードを選択しようとしています。 (フィールドAはフィールドBと同じ値ではありません)。これにはalias_attributesが含まれます。レールコードをデータベース名から分離できるように、わかりやすいデータベース名ではなくエイリアス名を使用できるようにしたいと考えています。フィールドの比較でActiveRecordを選択

モデル:

query = where('fielda != fieldb') 

しかし、私はむしろのようなものを持っていると思います:

alias_attribute :item_amount, :fielda 
alias_attribute :item_applied_amount, :fieldb 

このコードは動作しますあなたは、データベースが知っているので、それを行うことはできません私見

query = where.not(item_amount: item_applied_amount:) 

答えて

3

あなたのモデルで定義されているエイリアスについては何もありません。

さらに、エイリアスが機能していても、where(item_amount: :item_applied_amount)はSQLではfielda = 'fieldb'に変換されます。 fielda列の値が文字列"fieldb"(いない列fieldbの値)と等しくなければなりません

しかし、あなたは元の名前を取得し、適切なクエリを構築するために返された文字列を使用するattribute_alias(name)を使用することができます:それは意味

where(
    "#{attribute_alias(:item_amount)} != #{attribute_alias(:item_applied_amount)}" 
) 

それとも、可読性向上させるために範囲を定義する場合があります

scope :without_matching_amounts, -> { where('fielda != fieldb') } 

とこのようにそれを使用します。

query = Model.without_matching_amounts 
+0

をあなたは何ができるか

は次のようにエイリアスを作成していますそれは意味が分かります。どこで( "#{attribute_alias(:item_amount)}!=#{attribute_alias(:item_applied_amount)}") –

0

@spickermannと同様に、aliasはrubyメソッドエイリアスを実行しますが、SQLではエイリアスを作成しません。

scope :with_aliases, -> { 
    select('table.*, table.item_amount as fielda, table.item_applied_amount as fieldb') 
} 

そしてような何か::これは私が探して、それが動作するほとんど変更しています何確かにある

Model.with_aliases.where('fielda <> fieldb') 
+0

申し訳ありませんが、私は十分にクリアされませんでした。私はフィールド名が何を表しているか明確ではないので、 "フィールド"と "フィールドb"という謎の名前を使わないようにしています。 "fielda"は、誰かに "item_value"を表していることを知らせていないので、一目で分かりにくいです。 –

関連する問題