我想从数据库中解释一些数据,就像这样...
DataA xyz > I am data a
DataA zyx > I am data a
DataB xyz > I am data b
DataB zyx > I am data b
DataC xyz > I am data c
DataC zyx > I am data c
所以在我的模型中,我有...
def get_data
if data.include? "DataA" then "I am data a"
elsif data.include? "DataB" then "I am data b"
elsif data.include? "DataC" then "I am data c"
end
end
哪个有效,但我觉得我做错了。有没有实现上述目标的正确方法?
我的第二个问题是如何采用该方法并仅生成唯一记录。在我看来,我有...
<td>
<% Product.each do |f| %>
<%= f.get_data.distinct %>
<% end %>
</td>
但是我得到了错误
“我是数据c”的未定义方法“ distinct”:字符串
答案 0 :(得分:2)
通常,当您看到一堆if / elsif / elsif链接在一起时,这是一种代码味道。我可以想到两种将其编写得更干净的方法:
def get_data
case data
when 'DataA' then 'I am data A'
when 'DataB' then 'I am data B'
when 'DataC' then 'I am data C'
end
end
或
DATAS = {'DataA' => 'I am data A', 'DataB' => 'I am data B', 'DataC' => 'I am data C'}
def get_data
ret_val = nil
DATAS.each{|k,v| ret_val = v if k.includes?(data)}
ret_val
end
对于第二个问题,您需要查询唯一值,然后调用get_data方法
<% Product.distinct(:data).each do |f| %>
<%= f.get_data %>
<% end %>
答案 1 :(得分:0)
您的问题非常模糊,但我会尝试用我认为您的意思回答。对于第一个问题,如果只希望保存唯一记录,则可以在模型上使用validates :<attribute>, uniqueness: true
,这样可以确保在保存到数据库之前是唯一的。我不确定这是否是您的意思,请详细说明get_data
的工作以及为什么需要这样做。
对于第二个问题,您正在返回字符串,并且String类没有方法distinct
,该方法属于Array
,因此您可以执行类似result = []
和然后if <whatever> then arr << "Some string" end
。同样,分享一些更多的信息,以便我们提供更好的答案。