Rails 3与非标准关键字段连接

时间:2011-02-03 20:26:57

标签: ruby-on-rails

我已经用谷歌搜索了自己差点就死了,而我最接近的是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 console中获得的:

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]

2 个答案:

答案 0 :(得分:0)

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

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

即可

答案 1 :(得分:0)

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

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

set_table_name "Lists"

:listitem(s)的多个(或缺少)似乎在此更改之前或之后没有效果。