Rails has_one: через Ассоциацию для самостоятельных ссылок 1-к-1-к-1 - PullRequest
0 голосов
/ 07 декабря 2010

У меня есть модель Factsheet, которая содержит ассортимент публикаций, включая версии на альтернативных языках.Версии на разных языках должны храниться отдельно как отдельные записи (потому что они могут быть заказаны / обновлены / и т. Д. Отдельно), но я пытаюсь связать их друг с другом, чтобы вы могли легко определить, когда одна публикация испанская (илиКитайская и т. Д.) Версия другого.

Я хотел бы использовать ассоциацию :through, чтобы взаимосвязь была симметричной, например, если в Английском информационном бюллетене A есть Испанский вариант информационного бюллетеня B, то аналогично в информационном бюллетене B естьАнглийская версия Factsheet 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

Так что что-то не так с моими ассоциациями, но я не совсем уверен, что.Мысли?

Кроме того, это даже звуковой дизайн для данных, или я должен здесь что-то делать по-другому?

1 Ответ

1 голос
/ 07 декабря 2010

Я не тестировал это решение, но я думаю, что общее архитектурное направление, которое вы хотите выбрать, заключается не в сквозных отношениях, а в чем-то вроде:

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

Я не думаю, что это абсолютно правильно, но в любом случае это поможет вам встать на путь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...