Как вы даете классу в контроллере идентификаторы, к которым он принадлежит? - PullRequest
0 голосов
/ 17 июля 2011

Как мне дать моим продуктам user_id, Location_id и product_dates_id в контроллере?

class Product < ActiveRecord::Base
  belongs_to :user
  belongs_to :location
  belongs_to :product_date
end

Мой контроллер:

def new
    @location = Location.new
    @product = Product.new
    product_date = @location.product_dates.build
    product_date.products.build
end

def create
    @location = Location.new(params[:location])
end

Моя таблица:

create_table :products do |t|
      t.integer :user_id
      t.integer :location_id
      t.integer :product_date_id
end

Спасибо.

Ответы [ 2 ]

2 голосов
/ 17 июля 2011
@location = Location.create(params[:location])
@location.products.each{ |p| p.update_attribute :user_id, current_user.id }
@location.product_dates.map(&:products).flatten.each{ |p| p.update_attribute :user_id, current_user.id }

или лучше добавьте скрытое поле для :user_id в каждый продукт и дату_продукта

1 голос
/ 15 августа 2011

Чтобы ответить на ваш вопрос

def new
    #First create the new product object assuming you have a current_user available. If not you will need to make a current_)user available.
    @product = current_user.build_product
    #Now build a new location for the product
    location = @product.build_location # You don't need location to be an instance variable.
    #when you reference @location in your form you should now be using fields_for :locations instead.
    #build a new product_date object for the location_product_dates array
    product_date = @location.product_dates.build
    #Now add that product date object to the product
    product.product_date = product_date
end

Добавьте объявления accepts_nested_attributes к соответствующим моделям и используйте объявления fields_for в соответствующих формах продукта, чтобы ваши действия по созданию и обновлению не нуждались в каких-либо изменениях, так как объявления fields_for в форме будут располагать связанные объекты их данные вложены в хэш продуктов, когда они отправляются обратно в действия создания и обновления.

Соедините это с объявлениями acceptpts_nested_attributes_for для всех нужных моделей, и все будет автоматически обновлено / создано

Это отвечает на ваш вопрос. Новое действие создает все записи и устанавливает все ассоциации для вас, но мне кажется, что вам не нужно указывать дату продукта, связанную с продуктом, поскольку она уже связана с местоположением, связанным с продуктом, и как В расположении может быть много продуктов (при условии, что вы исходите из нового действия), вам будет сложно определить, какая product_date из множества записей местоположения и связанных с ними записей product_date должна быть добавлена ​​непосредственно в продукт.

Полагаю, у вас немного неправильные ассоциации.

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

@product = Product.new_with_associations(current_user)

Значение def self.new_with_associations должно просто выполнять почти то же самое, что и код, который я дал вам для нового действия, но вам нужно будет передать current_user в качестве параметра в качестве хеша сеанса (именно здесь current_user в конечном итоге из-за) недоступна для моделей по очень веской причине.

Использование этого метода в классе для продукта не только очищает код вашего контроллера, но и делает его повторно используемым и более простым для тестирования как с консоли, так и с вашего набора тестов

...