2011-01-12 3 views
0

У меня есть 4 модели, с которыми я имею дело. У меня есть учетная запись, местоположение, тег и метка. Я поставил его, как следуетРельсы - Имеет много: через, с несколькими путаницами моделей

class Tag < ActiveRecord::Base 

    # belongs_to :shelter 
    has_many :taggings, :dependent => :destroy 
    has_many :locations, :through => :taggings 
    has_many :accounts, :through => :taggings 

end 

class Tagging < ActiveRecord::Base 

    belongs_to :location 
    belongs_to :tag 
    belongs_to :shelter 

end 

class Account < ActiveRecord::Base 
    has_many :taggings, :dependent => :destroy 
    has_many :tags, :through => :taggings, :dependent => :destroy 
end 

class Location < ActiveRecord::Base 
    has_many :taggings, :dependent => :destroy 
    has_many :tags, :through => :taggings, :dependent => :destroy 
end 

create_table :taggings, :force => true do |t| 
    t.references :account 
    t.references :location 
    t.references :tag 
    t.timestamps 
end 

Проблема у меня, когда я создаю форму он находится на странице Расположение. Я хочу, чтобы иметь возможность отмечать местоположение, но связать его с учетной записью, и я борюсь с логикой правильности правильной формы и логики контроллера.

В форме У меня есть/location/1/tags Вложенная форма , Но в контроллере я не могу понять, как правильно добавить тег. Вот мои TagsController

def create 
    @tag = Tag.find_or_create_by_name(params[:tag][:name]) 
    @location = @current_account.locations.find(params[:location_id]) 
    @location.tags << @tag 
end 

Он работает, но создает несколько строк. Я хочу иметь возможность создать тег, а затем назначить местоположение, учетную запись, тег для маркировки.

+0

Как же у вас есть belongs_to: укрытие в вашей модели мечения. Должна ли она быть принадлежать_у: учетной записи? – JosephL

+0

Джозеф, вы правы ... это был беспорядок в разрезе и пасте. Исправьте бой, что – bokor

ответ

1

Как насчет

@tag = Tag.find_or_create_by_name(params[:tag][:name]) 
@location = @current_account.locations.find(params[:location_id]) 
@tagging = Tagging.create(:tag => @tag, :location => @location, :shelter => @current_account) 
+0

Работали как шарм. Спасибо за этот совет, поскольку я не знал, что вы можете сделать Tagging.create именно так. Похоже, ты дал мне больше работы, так как мне придется очистить какой-то другой код. – bokor

+0

Вы рекомендуете хороший способ сделать это из формы. У меня есть другой подобный объект, который у меня есть с аналогичной настройкой. Вызванные места размещения, поэтому, если бы я сделал Placements.new в форме, но у вас были такие переменные, как указано выше, вы бы установили их в форме как скрытые поля (чтобы минимизировать запросы) или поиск в контроллере – bokor

+0

Не уверен, что я понимаю что вы имеете в виду, но, похоже, вы выполняете одинаковое количество запросов: либо до визуализации формы (для установки значений скрытого поля), либо после публикации формы (для извлечения экземпляров модели). Учитывая, что «преждевременная оптимизация - это корень всего зла», я бы не стал беспокоиться о сохранении нескольких запросов, пока это действительно не проблема (если, конечно, вы не выполняете ненужные запросы в цикле или что-то еще). –