【问题标题】:Rails 3 joins with non-standard key fieldsRails 3 加入非标准关键字段
【发布时间】:2011-02-04 06:53:15
【问题描述】:

我几乎用谷歌搜索了自己,而我最接近类似的东西是this stack overflow question(它试图一次问几个问题)。我只有一个。好的,两个 - 但只要回答第一个,只要它符合以下要求,您的回答就会被接受。

我正在使用带有旧数据库的 Rails 3 和 Ruby 1.8.7。唯一值得讨论的是 Rails 版本。我被 Ruby 1.8.7 和数据库结构困住了。

以下是所涉及模型的重要部分:

class List < ActiveRecord::Base
    set_primary_key "ListID"

    has_many :listitem, :foreign_key => "ListID", :dependent => :destroy
    has_many :extra_field, :foreign_key => "ListID", :dependent => :destroy
end

class Listitem < ActiveRecord::Base
    set_table_name "ListItems"
    set_primary_key "ListItemID"

    belongs_to :list
    has_many :list_item_extra_field, :foreign_key => 'ListItemID', :dependent => :destroy
end

这是我在 rails 控制台中得到的:

irb(main):001:0> List.joins(:listitem).to_sql
=> "SELECT [lists].* FROM [lists] INNER JOIN [ListItems] ON [ListItems].[ListID] IS NULL"

当我期待 sql 语句更像:

SELECT [lists].* FROM [lists] INNER JOIN [ListItems] ON [ListItems].[ListID] = [Lists].[ListID]

让我回答上面的问题会得到正确的答案。如果您能告诉我如何获得相当于以下内容的奖励积分:

SELECT [lists].*, COUNT([ListItems].*) FROM [lists] INNER JOIN [ListItems] ON [ListItems].[ListID] = [Lists].[ListID]

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

    您的第一个问题:您可能搞砸了表迁移。在迁移文件中使用

    create_table :lists, {:id => false} do     
    ....
    end
    

    然后添加execute "ALTER TABLE lists ADD PRIMARY KEY (listid);" 顺便说一句,它是has_many :listitems(复数,不是单数)。

    详细解释看这里:Using Rails, how can I set my primary key to not be an integer-typed column?

    第二个问题:我会使用多种方法的组合,而不是一种方法。您需要返回列表名称,然后计算此列表中列表项的名称,对吗?解决第一个问题后,只需使用list.namelist.list_items.count

    【讨论】:

      【解决方案2】:

      像往常一样,Rails 的答案非常简单......

      我的表使用大小写混合命名。将以下行添加到我的 List 模型中修复它:

      set_table_name "Lists"
      

      :listitem(s) 的多个(或缺少)在此更改之前或之后似乎没有任何影响。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-05
        • 2011-03-14
        • 1970-01-01
        相关资源
        最近更新 更多