【问题标题】:ambiguous column name: error not working with tags不明确的列名:错误不适用于标签
【发布时间】:2014-02-07 02:43:17
【问题描述】:

我有一些代码可以按如下所示的受欢迎程度来显示我的食谱。这存储在我的食谱视图的索引文件中。

<% @all_recipes.this_week.reorder("likes_count DESC").limit(10).each do |i| %>
  <%=link_to image_tag(i.image(:fixed), alt: "MUC", :class => "browse-recipes"), i %>
<% end %>

如您所见,我通过了一个方法“this_week”,它完美地定义为一个范围。

我的问题是,我在同一页面上有一个标签云,当我点击一个标签时,应该刷新页面,但只显示那些带有关联标签的食谱。如果没有应用 this_week 方法,这可以完美地工作,但如果该方法是否出现以下错误:

SQLite3::SQLException: ambiguous column name: created_at: SELECT  "recipes".* FROM     "recipes" JOIN taggings recipes_taggings_81e277c  ON recipes_taggings_81e277c.taggable_id = recipes.id AND recipes_taggings_81e277c.taggable_type = 'Recipe' AND recipes_taggings_81e277c.tag_id = 33 WHERE "recipes"."live" = 't' AND (created_at > '2014-01-13 00:00:00.000000')  ORDER BY likes_count DESC LIMIT 10

有什么想法吗?非常感谢。

【问题讨论】:

    标签: ruby-on-rails scope ambiguous


    【解决方案1】:

    您必须在配方表和标签表中都有一个created_at 字段。 MySQL 不知道它应该订购哪一个。无论您在哪里进行排序(在 this_week 范围内或在 tag 方法中),都需要更改:

    order('created_at')
    

    到这里:

    order('recipes.created_at')
    

    假设您想按配方字段订购。如果您不喜欢对表名进行硬编码,您可以使用 self.class.table_name 并将其替换。

    【讨论】:

    • 天才!谢谢,这正是我所需要的。它令人讨厌地隐藏在我的一个担忧中!
    • @PhilipHallstrom 这可以用哈希而不是字符串来完成吗?
    • @BKSpureon 没有。哈希版本仅适用于 asc/dec ala order(created_at: desc)
    • 您也可以使用order('created_at').references(:recipes)
    • 我个人使用了order("#{self.table_name}.created_at")(没有class),它对我有用
    猜你喜欢
    • 1970-01-01
    • 2018-10-23
    • 1970-01-01
    • 1970-01-01
    • 2021-12-13
    • 1970-01-01
    • 1970-01-01
    • 2015-01-07
    相关资源
    最近更新 更多