2011-02-03 50 views
0

我已經使用Google自己搜索了幾乎所有這一切,並且最接近我找到類似的東西是this stack overflow question(它試圖一次提出幾個問題)。我只有一個。好的,兩個 - 但提供第一個答案會讓你的答案接受,只要它符合下面的要求。Rails 3加入非標準關鍵字段

我正在使用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 

這是我得到的軌道控制檯:

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

像往常一樣,答案是使用Rails可笑的簡單...

我的表可以使用大小寫混合命名。添加下面一行到我的列表模型固定它:

set_table_name "Lists" 

:listitem(s)多個(或缺乏)出現之前或此更改後沒有任何效果。

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