我是否正确(模型内部方法)以及如何删除重复项

时间:2018-11-09 11:35:50

标签: ruby-on-rails ruby methods model unique

我想从数据库中解释一些数据,就像这样...

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”:字符串

2 个答案:

答案 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。同样,分享一些更多的信息,以便我们提供更好的答案。