Ваша схема базы данных на самом деле не соответствует предписанным соглашениям Rails, поэтому вам, вероятно, будет трудно заставить работать ассоциацию has_many по умолчанию. Вы пробовали возиться с пользовательскими опциями SQL, думая об этом?
Если вы не можете заставить работать встроенную ассоциацию has_many
, вам придется свернуть свою собственную. Я бы определил методы books
и books=
в вашей модели Библиотеки, и внутри них установил бы виртуальный атрибут, который вы затем сохраните в виде массива в базе данных. Возможно, что-то вроде этого:
class Book > ActiveRecord::Base; end
class Library > ActiveRecord::Base
before_save :serialize_books
def books
@books || nil
end
def books=(new_books)
@books = new_books
end
private
def serialize_books
@attributes['books'] = "[" + @books.collect {|b| b.id }.join(',') + "]"
end
end
То, что там не будет извлекать данные. Если вы хотите пойти еще дальше и поддерживать операции поиска с одним запросом, вы можете использовать некоторый пользовательский SQL в области видимости или переопределить поиск и добавить его к параметрам по умолчанию. Прокомментируйте, если вы хотите помочь с этим!