2010-12-07 62 views
0

我有一個Factsheet模型,其中包含各種各樣的出版物,包括備用語言版本。不同的語言版本應該作爲單獨的記錄分開保存(因爲它們可以單獨訂購/更新等),但我試圖將它們彼此聯繫起來,以便您可以輕鬆地分辨出一個出版物是西班牙語(或中國等)版本的其他。Rails has_one:通過自我參照協會1對1對1

我想使用:through關聯,以便關係是對稱的,例如,如果英語資料單張A有一個西班牙語版本簡報B,那麼類似的情況說明B有一個英文版的宣傳冊A.

這裏是我的模型:

class Factsheet < ActiveRecord::Base 
    has_many :publications_language_relationships 
    has_one :en, :through => :publications_language_relationships 
    has_one :es, :through => :publications_language_relationships 
    has_one :zh, :through => :publications_language_relationships #zh = Chinese 

    # other stuff 
end 

和...

# Table name: publications_language_relationships 
# 
# en_id  :integer 
# es_id  :integer 
# zh_id  :integer 
# 
class PublicationsLanguageRelationship < ActiveRecord::Base 
    belongs_to :en, :class_name => 'Factsheet' 
    belongs_to :es, :class_name => 'Factsheet' 
    belongs_to :zh, :class_name => 'Factsheet' 
end 

但當我啓動一個Rails控制檯來檢查是否可以工作...

$ fs = Factsheet.last 
=> #<Factsheet id: 5, title: "Despu\xC3\xA9s de un diagn\xC3\xB3stico de c\xC3\ 
xA1ncer de seno: Con...", backend_code: "fs_after_bc_diagnosis_es", language: 
"es", created_at: "2010-11-30 21:23:01", updated_at: "2010-12-06 16:13:23"> 

$ fs.en 
ActiveRecord::StatementInvalid: SQLite3::SQLException: no such column: publicati 
ons_language_relationships.factsheet_id: SELECT "factsheets".* FROM "factsheets" 
INNER JOIN "publications_language_relationships" ON "factsheets".id = "publicat 
ions_language_relationships".en_id WHERE (("publications_language_relationships" 
.factsheet_id = 5)) LIMIT 1 

所以somethi ng與我的協會不協調,但我不確定是什麼。思考?

此外,這是一個甚至是數據的聲音設計,還是應該在這裏做不同的事情?

回答

1

我沒有測試過該方案,但我認爲你想利用一般的建築方向是不是真正通過:通過關係,而是像:

class Factsheet < ActiveRecord::Base 
    has_many :publications_language_relationships 

    named_scope :translation, lambda { |trans| 
     { :conditions => ["publications_language_relationships = ?", trans.to_s ] , 
     :joins => :publications_language_relationships 
     } 
    } 

    # other stuff 
end 

class PublicationsLanguageRelationship < ActiveRecord::Base 
    belongs_to :fact_sheet 
end 

然後,我想你倒是調用您的控制器/視圖的東西翻譯是這樣的:

#controller 
def show 
    @fact_sheet = FactSheet.find(params[:id]) # to load up the FactSheet 
end 

#view (to get the right translation) 
@fact_sheet.translation(:en) #for english 

我不認爲這是絕對正確的,但它應該讓你的道路上呢。