我正在尝试从黄瓜的三列内联数据表中读取数据。
功能文件:
Then I should see grades,exteriors, interiors and engines available:
|grades |exteriors | engine |
|xdata-id-Elegance |xdata-id-NH-788p | 12345 |
| |xdata-id-NH737M | |
| |xdata-id-NH731P | |
| |xdata-id-R-539P | |
Step_definitions:
Then(/^I should see grades,exteriors, interiors and engines available:$/) do |table|
data = table.rows_hash
puts data['exteriors']
end
这给了我错误只允许2行。
有没有人知道我可以访问的另一种方式,所有三列都使用表对象?
答案 0 :(得分:3)
以更简单的方式为我工作,使用三列数据表:
def self.group_similar_changes(owner, target, change_type)
# long query where it selects all rows where change_owner and change_target
# are the same as original
# also where cancelled is false
# determine if cancelled (yaml)
# if cancelled (do nothing)
similar_changes = Notification.where(
change_owner: owner,
change_target: target,
change_cancelled: false
)
similar_changes.each do |change|
cancel_inverse_change(change, change.change_type)
if change.cancelled?
similar_changes.delete(change)
end
end
end
end
def cancel_inverse_change(change, change_type)
if change.inverse?(change_type)
change.cancel
end
end
def inverse?(possible_inverse_change)
is_inverse = false
change_types = YAML.load_file(File.join(NotificationManager::Engine.root, 'config/change_types.yaml'))
if self.change_type == change_types[possible_inverse_change]['inverse']
is_inverse = true
end
return is_inverse
end
这对我有用:
Scenario: I am able to select a date range
Given I am on the rejections tracker page as a superuser
Then the date range filters work as expected
| dateFrom | dateTo | variance |
| 12/05/2014 | null | lesser than |
| null | 12/07/2014 | lesser than |
| null | null | equal to |
输出:
Then(/^the date range filters work as expected$/) do |table|
data = table.hashes
date_from = []
date_to = []
variance = []
data.each do |row|
row.each do |key, value|
if key.eql? "dateFrom"
date_from << value
elsif key.eql? "dateTo"
date_to << value
elsif key.eql? "variance"
variance << value
end
end
end
puts date_from
puts date_to
puts variance
end
答案 1 :(得分:2)
您可以使用raw
获取表格,然后使用Ruby将其操作为您想要的表单。
例如,下面显示了如何获取表,然后将其转换为哈希,其中键是列标题,值是该列中值的数组。
Then(/^I should see grades,exteriors, interiors and engines available:$/) do |table|
data = table.transpose.raw.inject({}) do |hash, column|
column.reject!(&:empty?)
hash[column.shift] = column
hash
end
p data['grades']
#=> ["xdata-id-Elegance"]
p data['exteriors']
#=> ["xdata-id-NH-788p", "xdata-id-NH737M", "xdata-id-NH731P", "xdata-id-R-539P"]
p data['engine']
#=> ["12345"]
end
答案 2 :(得分:0)
rows_hash
方法适用于特定类型的表。具体来说,它是一个有两列的表格,标题在左栏中。例如:
|grades |xdata-id-Elegance|
|exteriors|xdata-id-NH-788p |
|engine |12345 |
但是,您的数据不止一行,因此您使用的是正确类型的表格。
您可以使用常规hashes
方法,它将返回一个哈希数组,然后从中提取所需的数据。例如:
Then(/^I should see grades,exteriors, interiors and engines available:$/) do |table|
data = table.hashes
exteriors = []
data.each do |row|
row.each do |key, value|
exteriors << value if key == 'exteriors'
end
end
puts exteriors
end
此代码创建一个名为exteriors
的空数组,然后迭代data
数组中的每个值,而该数组又是原始表中非标题行的哈希值。这些散列中的每一个都使用标题作为键来表示表中某个行的值。
对于表中的每个非标题行,它然后遍历散列并用数据填充exteriors
数组。
答案 3 :(得分:0)
我以稍微不同的方式使用了表格。
&#34; table.hashes&#34;将表行分成数组,这样可以很容易地访问它。
所以我们可以像这样访问第一行:
puts data[0]
将导致: {&#34;成绩&#34; =&gt;&#34; xdata-id-Elegance&#34;,&#34;外部&#34; =&gt;&#34; xdata-id-NH-788p&#34; ,&#34;引擎&#34; =&gt;&#34; 12345&#34;}
然后可以遍历对象并使用&#34; .each&#34;打印所有对象,如下所示:
data.each do |row|
puts row
end
这将基本上打印您的表中的所有值分组到数组(这是您的行)。所以上面提到了一堆结果。
现在还可以直接访问您想要的密钥,只需执行以下操作:
data.each do |row|
puts row["exteriors"]
end
仅打印该列中的值。