0

似ている 2 つのモデルがあるとします。1 つは、Primer3Parameter のフィールドのサブセットを保持する Primer3Template と呼ばれます。

Primer3Parameter に存在する Primer3Template のフィールドのみを置き、フィールド名を大文字にし、文字列補間を追加したいと思います。次のように、コードが部分的に機能しています。

> t = Primer3Template.new
> @primer3_parameter = Primer3Parameter.where(:batch_detail_id => 7146)
> t.attributes.each  do | name, value |
>     puts "#{name.upcase}="
>   end

これまでのところ、これは次のように出力されます。

ID=
TYPE=
USER_ID=
BATCH_DETAIL_ID=
GENERATED=
STATUS=
P3_FILE_TYPE=
....etc

次に、ループによって処理されている現在の名前と同じ名前を持つ @primer3_parameter 変数からフィールドの値を出力しようとしています。私はこれを試しました:

> t.attributes.each  do | name, value |
>     puts "#{name.upcase}=#{@primer3_parameter.name}"
>   end

しかし、これはクラスの名前を出力していますが、これは私が望むものではありません:

ID=Primer3Parameter
TYPE=Primer3Parameter
USER_ID=Primer3Parameter
BATCH_DETAIL_ID=Primer3Parameter
GENERATED=Primer3Parameter

いくつかのフィールドをスキップして、フィールドの値を次のように出力したい:

BATCH_DETAIL_ID=7146
GENERATED=true
STATUS=active
P3_FILE_TYPE=Type2

私もこれを試しました:

>  t.attributes.each  do | name, value |
> x = "@primer3_parameters.first.#{name}"
> puts "#{name.upcase}=#{x}"
> end

それは私に与えました:

ID=@primer3_parameters.first.id
TYPE=@primer3_parameters.first.type
USER_ID=@primer3_parameters.first.user_id
BATCH_DETAIL_ID=@primer3_parameters.first.batch_detail_id
GENERATED=@primer3_parameters.first.generated
4

3 に答える 3

2

これ:

@primer3_parameters = Primer3Parameter.where(:batch_detail_id => 7146)

コレクションの関連付けを返します。Primer3Parameter に関連付けられたレコードをトラバースする場合は、それらを反復処理する必要があります。このような:

@primer3_parameters.each do |primer3_parameter|
  primer3_parameter.attributes.each do |name, value|
  .....

残りは以前に行った方法です。

于 2013-08-03T13:21:37.150 に答える
1

これには eval を使用しないでください。けがをする可能性があります!

ここに良い代替手段があります

attribute_names = Primer3Template.accessible_attributes
@primer3_parameter = Primer3Parameter.where(:batch_detail_id => 7146)
attribute_names.each do |attr_name|
  puts "#{attr_name.upcase}=#{@primer3_parameter.read_attribute(attr_name)}"
end

@primer3_parameter.read_attribute(attr_name)あなたができると思う代わりに@primer3_parameter[attr_name]、欠点があるかどうかはわかりません

于 2013-08-03T21:16:50.873 に答える
0

とった!!!

> t = Primer3Template.new
> p = Primer3Parameter.where(:batch_detail_id => 7146).first
> t.attributes.each do |name, value|
>     x = eval("p.#{name}")
>     puts "#{name.upcase}=#{x}"
>   end

出力

ID=15
TYPE=Primer3Parameter
USER_ID=
BATCH_DETAIL_ID=7146
GENERATED=false
STATUS=ready
P3_FILE_TYPE=settings
P3_FILE_ID=
P3_FILE_FLAG=false
P3_COMMENT=
SEQUENCE_EXCLUDED_REGION=
SEQUENCE_FORCE_LEFT_END=-1000000
SEQUENCE_FORCE_LEFT_START=-1000000

Rubyが好きだと言いましたか?これが他の誰かに役立つことを願っています。

編集 - 改善されたソリューション

  • テンプレート クラスをインスタンス化する必要はありません
  • まさに私が望んでいたアクセス可能なフィールドのみを返します

.

 Primer3Template.accessible_attributes.each do |name|
      x = eval("p.#{name}")
      puts "#{name.upcase}=#{x}"
 end
于 2013-08-03T13:43:26.567 に答える