我已经用谷歌搜索了自己差点就死了,而我最接近的是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]
答案 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.name
和list.list_items.count
答案 1 :(得分:0)
像往常一样,Rails的答案非常简单......
我的表格使用大小写混合命名。将以下行添加到我的List模型中修复它:
set_table_name "Lists"
:listitem(s)
的多个(或缺少)似乎在此更改之前或之后没有效果。