0

假设我有两个相似的模型。一个称为 Primer3Template,它包含 Primer3Parameter 上的字段子集。

我想只放置 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 回答