2015-04-10 7 views
0

Я как-то недавно стал промежуточным (: D) в рельсах, и я начинаю решать более сложные проекты, требующие множественного класса и взаимодействия с моей моделью, и я как бы теряюсь в том, как создавать/заказывать мой код.рубин на рельсах Создание внутри модели?

У меня есть product_table и product_details_table.

Каждый раз, когда продукт создается, изображение загружается вместе с ним.

В классе продукта я создал несколько методов, которые заполняют виртуальные атрибуты для этого продукта, связанные с этим изображением (размер и т. Д.). Это все работает с обратным вызовом paperclip после загрузки.

Моя проблема заключается в том, что из этого размера изображения я хотел бы автоматически генерировать значения атрибутов в моей таблице product_details.

Product_details.new(product_id:current_product_id(**is it self.id here?**),size:product.virtual_attribut_size,x:virtual_attribut_x) 

Как вы это сделаете?

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

Если я делаю это в своей модели, я предполагаю, что он может работать (как обычный класс), но это способ сделать это?

Благодаря тем, кто пытается помочь

редактировать:

В основном моя модель продукта будет выглядеть следующим образом:

class Product < ActiveRecord::Base 
    def image_to_inch 
    #return "30x30" (in inch) for an image uploaded in pixel (divide  the number of pixel by 300dpi to get a good quality print) 
    end 
    def image_printable_size 
    #use previous method result to output an array of all printable size from a list of predifined sizes. example : 30x30 can be printed in 30x30,20x20,10x10 but not 40x40. 
    #output ["30x30","20x20","10x10"] 
    end 

##Here i should iterate over the array and create a product_details line for that product for each size : 

    ## simplified version of what i was going for and that look really really ugly : 
    ["30x30","20x20","10x10"].each do |size| 
    ProductDetail.create!(product_id:self.id,size:size) 
    end 
end 

я уже ушел из обратных вызовов, проверки и т.д.. так что его легче читать.

+0

Какова связь между продуктом и продуктом? –

+0

'class Продукт jayD

ответ

1

Ваши требования не ясны, но вот некоторые советы по стратегии.

  1. Использовать обратные вызовы before_save или after_save для автоматизации кода.
  2. Использовать переменные attr_accessor для хранения временных объектов, которые используются перед обратными вызовами before_save и after_save
  3. Сделать простые методы для простых вещей. Помните, что вы можете написать свои собственные методы получения и настройки.

Итак, ваш подход может быть примерно таким: я догадываюсь о вашей схеме, поэтому не зацикливайтесь на деталях.

class Product 
    has_one :product_detail 
    after_save :update_product_details 

    def update_product_detail 
    product_detail = self.product_detail || self.product_detail.build 
    if self.image 
     product_detail.update_from_image(self.image) 
    end 
    product.save 
    end 

class ProductDetail 
    belongs_to :product 

    def update_from_image(image) 
    self.size = image.size 
    #... any other settings taken from the image 
    end 
+0

Спасибо. Вы научили меня «.build», которые выглядят потрясающе. Моя проблема заключается в том, что у Продукта много деталей продукта. Каждая строка - это в основном размер продукта, print_size (его покраска), eshopprice, артистическая комиссия (введенная при создании продукта пользователем, для каждой размерной комиссии другая) – jayD

+0

Как я уже сказал, вы можете адаптировать мой подход к деталям вашего собственной схемы. –

+0

Так что я могу использовать себя.v_attributs в моей модели продукта, чтобы создать новую строку для самого продукта? 'ProductDetail.create! (Product_id: self.id, size: self.size)' Наверное, я действительно не понимаю, почему вы используете метод из модели ProductDetail внутри Product Model, а не передаете его напрямую, как Аргумент. как мое создание! выше. спасибо за помощь в любом случае – jayD

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