0

Railsのクエリ文字列とテーブル名の両方をdbに保存し、実行時に実行するためにそれらを取得したいと思います。シナリオは次のとおりです。

customerテーブルからアクティブなレコードを取得しcustomersます。次のように定義された2つの変数があるとします。

table_name = 'Customer'
query_string = ':active => true'

Railsでは、クエリは次のようになります。

records = Customer.where(:active => true)

これで、テーブル名とクエリ文字列が変数table_nameとquery_stringに格納され、次のような2つの変数でクエリ文字列を組み立てることができます。

 records = table_name.where(query_string) ?

助けてくれてありがとう。

4

2 に答える 2

2

これを行うこともできますが、通常、文字列をハッシュとして評価することはお勧めしません。また、table_name変数の残念な名前です。実際にはクラス名を格納しているためです (テーブルは「customers」になります)。いずれにせよ、欠けているのはこれらの文字列の評価です:

records = class_name.constantize.where(instance_eval(query_string))

instance_evalユーザーが入力した文字列で実行すると、セキュリティとアプリケーションの健全性が損なわれる可能性があることに注意してください。注意して使用し、実際のハッシュの構築に固執してください。

于 2013-03-11T14:17:01.660 に答える
1

の定義instance_evalは次のとおりです。Evaluates a string containing Ruby source code, or the given block, within the context of the receiver (obj).

クエリ文字列を評価する別の方法は、次whereのように文字列に含めることです。

table_name = 'Customer'
query_string = 'where(:active => true)'

次に、レコードは次の方法で取得できます。

records = table_name.constantize.instance_eval(query_string)

文字列に入れることで、上記の質問のようにwhereソース コードを返すだけでなく、instance_eval の全機能を使用できます。where

于 2013-03-14T21:28:10.367 に答える