У меня есть 4 модели: Drawer, Folder, FolderDocument и Document следующим образом:
class Drawer < ActiveRecord::Base
has_many :folders #Drawer has many folders
end
class Folder < ActiveRecord::Base
belongs_to :drawer
has_many :folder_documents
# Folder has a "version" attribute which reflects the latest version
# Use proc to give back latest version by default e.g. folder.documents or folder.documents(5) will give back a specific version.
has_many :documents, :through => :folder_documents, :conditions => proc { |v = nil|
v ||= self.version
"documents.active IS TRUE AND version = #{v}"
}, :uniq => true
end
class FolderDocument < ActiveRecord::Base
# Has a version attribute
belongs_to :document
belongs_to :folder
end
class Document < ActiveRecord::Base
has_many :folder_documents
has_many :folders, :through => :folder_documents
end
Моя проблема в том, что я не могу создать
has_many :documents, :through => :folders
в классе Drawer, так как условия процедуры (для документов из FolderDocument) не могут быть рассчитаны, поскольку «версия» рассчитывается в контексте Drawer, а не промежуточной ассоциации папок.
Есть ли способ сделать это без создания другой модели между Folder и FolderDocuments, называемой FolderVersion?
РЕДАКТИРОВАТЬ: Цель состоит в том, чтобы получить все документы, принадлежащие папке для текущей версии (версии в папках).
has_many :drawers #Drawer has many folders
- person Firyn   schedule 21.02.2013folder.documents
, то folders.version = folders_documents.version и document.active истинно, но еслиfolder.documents(x)
, то условие будет проверять, что folders_documents.version равно x, а document.active истинно? - person Gary S. Weaver   schedule 21.02.2013documents.active IS TRUE AND folder_documents.version = #{v}
? Вы также можете использовать область действия в модели присоединения или делать такие вещи, как передача блока в has_many, чтобы переопределить методы ассоциации (например,<<(some_var)
и т. д., как указано в ответах на вопросы, на которые я ссылался. - person Gary S. Weaver   schedule 21.02.2013folder_documents.version = #{v}
противversion = #{v}
), вы могли бы просто использовать аналогичную ассоциацию и процедуру в любом классе, который вам нужен (просто изменив имена таблиц и т. д. по мере необходимости). - person Gary S. Weaver   schedule 21.02.2013v
правильно очищен, чтобы избежать SQL-инъекций. - person Gary S. Weaver   schedule 21.02.2013