【问题标题】:Rails search serialized recordsRails 搜索序列化记录
【发布时间】:2011-10-10 06:08:14
【问题描述】:

在模型中我将事件模型中的列类别序列化为数组,所以我有

serialize :category

问题是,我需要为用户提供搜索功能。那么我如何搜索一个类别是否在一个事件中。

Event.find(:all, :conditions => ['category = ?', params[:category]])

这不起作用,因为类别存储为序列化数组。有什么想法吗?

我能想到的唯一方法是获取所有事件并过滤掉每个实例。

Event.all.select{|e| e.category.include? params[:category]}

这根本没有效率。

否则,我可以使用like语句

Event.find(:all, :conditions => ['category = ?', "%-#{params[:category]}%"])

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

    我将为类别创建一个单独的表和模型。然后,您可以使用 has_many 关联获取某个类别中的所有事件。

    【讨论】:

    • 但是,该类别只有 3 或 4 个条目。所以我认为可能没有必要为它创建额外的表。假设创建表不是一个选项。有没有更好的搜索方式?
    • 我觉得建表效率更高。 SQL 整数只有 4 个字节,而 varchar(255) 是 256 个字节。因此,事件之间的引用,通过 category_events 表中的 4 行,到类别表将是 4 行 * 2 引用 * 4 字节 = 32 字节。此外,进行整数比较比字符串比较快得多。
    【解决方案2】:

    您可以使用.to_yaml 来匹配存储在数据库中的序列化格式。

    Event.where(category: params[:category].to_yaml)
    

    【讨论】:

      【解决方案3】:
      Event.where("category IN (?)" , params[:category].to_yaml)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-04-06
        • 2011-04-20
        • 1970-01-01
        • 2010-12-08
        • 2012-04-15
        • 1970-01-01
        • 1970-01-01
        • 2016-05-24
        相关资源
        最近更新 更多