2015-10-03 56 views
0

在我的網站(用sinatra編寫)我試圖建立一個數據庫。我有2個表,這裏稱爲表1和表2。如果你是真的,你可以用have_one

models.rb

class Table1 < ActiveRecord::Base 
    Table1.where(bool:true) has_one :table2 # PSUDO-CODE 
    # So that every record where bool:true has the relationship 
    # but every record where bool:false or bool:nil doesn't 
end 
class Table2 < ActiveRecord::Base 
    belongs_to :table1 
end 

我試圖找到一種方法,使標記PSUDO-CODE成實際的代碼段。我怎樣才能做到這一點?

+0

沒有標籤爲僞代碼的部分。但問題並不清楚。表格將始終如一;有什麼不同的是,實際上*是否是* table1和table2的實例之間的關係。 –

+0

@DaveNewton對不起,我只是編輯了'PSUDO-CODE'部分。就您餘下的評論而言,我希望能夠讓每個'table2'實例對應一個'table1'實例,但是反之亦然。 – thesecretmaster

+0

我認爲RDBMS的工作方式和當前的思維過程存在一個脫節:表格不會基於值進行更改。 –

回答

0

你不能直接這樣做:一類要麼有關係,或者沒有(儘管當然有可能是沒有相關的記錄)

您可以在關聯設定的條件,但求最好我的知識,你真的只能設置在相關的收集條件(即表2在這種情況下)

但是,您可以重寫生成的方法,因此,例如

class Table1 < ActiveRecord::Base 
    has_one :table2 
    def table2(*args) 
    bool ? super : nil 
    end 
end 

這適用於ActiveRecord的當前版本 - 不是如何遠遠的支持(老版本直接在類上定義關聯方法,所以你不能稱爲超級)

+0

在這個問題中,我說「我的網站[是](用sinatra寫的)」。這將與sinatra以及鐵軌一起工作嗎? – thesecretmaster

+0

您可以用'當前版本的活動記錄'替換'當前版本的導軌'。 sinatra版本不相關 –

+0

那麼'table2'被定義爲一個函數?你的解決方案是重新定義該函數,使得在類Table1中,table2被定義爲Table1.where(bool:true)?我只是有點困惑你的答案如何工作。 – thesecretmaster

相關問題