2013-03-20 6 views
1

У меня возникли проблемы с созданием правильного отношения HABTM (has_and_belongs_to_many), в котором требуется пользовательское поведение SQL. Идея состоит в том, чтобы иметь документы, которые могут быть прикреплены к одной службе или нескольким службам, а также к тем же службам, имеющим один или несколько Документов, прикрепленных к ней. Я создал модель «ResourceDocument», в которой содержится отношение, а не более традиционная установка с двумя идентификаторами, потому что там будет больше типов вещей, связанных с документами, таким же образом, что и Сервисы.ruby ​​on rails NameError: неопределенная локальная переменная или метод 'record'

Вот соответствующая часть модели документа:

class Document < ActiveRecord::Base 

    # ... etc ... 

    has_and_belongs_to_many :services, 
          :foreign_key => 'document_id', 
          :association_foreign_key => 'resource_id', 
          :join_table => 'resource_documents', 
          :insert_sql => proc {"insert into resource_documents (document_id, resource_id, type) values (#{id}, #{record.id}, 'Service')"} 

# ... etc ... 

end 

сопровождается соответствующей части спецификации услуг (блок-тест-файл), который звонит в HABTM отношение при выполнении вставки:

require 'spec_helper' 
describe Service do 
    before do 
    @org = Org.create!(:name => 'org', :asset_code => 'TRNT') 
    # ... etc ... 
    end 

    # ... etc ... 

    it "should not allow a document belonging to different org" do 
    new_org = Org.create!({:name => 'another test Org'}) 
    document = FactoryGirl.create(:document, :org => new_org, :services => [@service]) 
    @service.documents << [document] 
    @service.should_not be_valid 
    end 
end 

Когда я запустил rspec, этот конкретный модульный тест завершился с ошибкой, и в частности линия присвоения документа (FactoryGirl.create) лает и дает сообщение об ошибке, записанное в заголовке. Что я здесь делаю неправильно? Я довольно новичок в рубине, а точнее, всю концепцию выполнения :insert_sql по отношению к HABTM.

Благодарим за помощь!

+0

Что такое 'record' в' {"insert into values_documents (document_id, resource_id, type) values ​​(# {id}, # {record.id}, 'Service')"} ' – codeit

ответ

1

record передается :insert_sql в качестве аргумента, вы должны были бы сделать что-то вроде:

:insert_sql => proc {|record| "insert into resource_documents (document_id, resource_id, type) values (#{id}, #{record.id}, 'Service')"} 

Так что ваш код будет, как:

class Document < ActiveRecord::Base 

    # ... etc ... 

    has_and_belongs_to_many :services, 
          :foreign_key => 'document_id', 
          :association_foreign_key => 'resource_id', 
          :join_table => 'resource_documents', 
          :insert_sql => proc {|record| "insert into resource_documents (document_id, resource_id, type) values (#{id}, #{record.id}, 'Service')"} 

# ... etc ... 

end 

Edit

Из Rails 3.1 Примечания к выпуску:

Previously :insert_sql and :delete_sql on has_and_belongs_to_many association allowed you to call ‘record’ to get the record being inserted or deleted. This is now passed as an argument to the proc.

+0

Серж, спасибо! У меня есть немного больше проблем с кодированием, кроме этого, но это, безусловно, фиксировало основной блокпост, который у меня был. –

+0

Добро пожаловать! Не стесняйтесь спрашивать меня об этих проблемах, я помогу, как только смогу. – sergelerator

Смежные вопросы