gpt4 book ai didi

ruby-on-rails - 如何使用虚拟属性更新模型的属性?

转载 作者:数据小太阳 更新时间:2023-10-29 08:53:08 25 4
gpt4 key购买 nike

我有一个名为 UserPrice 的模型具有属性 :purchase_date (a date_select) 在其表中。使用我的表单,我可以一次创建多个 user_prices,但为了方便用户,我在 UserPrice 中创建了一个虚拟属性。模型名为 :all_dates这也是一个 date_select 字段,它的工作是替换 :purchase_dates所以用户只需选择 :all_dates日期字段。


问题与问题

:all_dates字段未更新 :purchase_date正在创建的我的 user_prices 字段。 我需要做什么才能获得我的 :all_dates字段更新 :purchase_date我的新领域 UserPrices ?

有没有人对如何执行此操作有任何提示?


参数

Parameters: 
"user_price"=> {
"all_dates(2i)"=>"10",
"all_dates(3i)"=>"27",
"all_dates(1i)"=>"2011"
},
"user_prices"=>
{
"0"=>{"product_name"=>"Item1", "store"=>"Apple Store","price"=>"6"},
"1"=>{"product_name"=>"Item2", "store"=>"Apple Store", "price"=>"7"}
},
"commit"=>"Submit"}

代码

  class CreateUserPrices < ActiveRecord::Migration
def self.up
create_table :user_prices do |t|
t.decimal :price
t.integer :product_id
t.date :purchase_date
t.timestamps
end
end
end

我拿出了:purchase_date字段,因此它不在 user_price 循环内。

<%= form_tag create_multiple_user_prices_path, :method => :post do %>
<%= date_select("user_price", "all_dates" ) %>
<% @user_prices.each_with_index do |user_price, index| %>
<%= fields_for "user_prices[#{index}]", user_price do |up| %>
<%= render "user_price_fields", :f => up %>
<% end %>
<% end %>
<% end %>




class UserPrice < ActiveRecord::Base
attr_accessible :price, :product_name, :purchase_date, :all_dates, :store
attr_accessor :all_dates
after_save :save_all_dates_to_user_prices
composed_of :all_dates, :class_name => "DateTime",
:mapping => %w(Time to_s),
:constructor => Proc.new { |item| item },
:converter => Proc.new { |item| item }

def user_prices
@user_prices = Array.new() { UserPrice.new }
end

protected

def save_all_dates_to_user_prices
if !self.all_dates.nil?
self.user_prices.each {|up| up.purchase_date = self.all_dates if up.new_record?}
end
end


class UserPricesController < ApplicationController

def new
@user_prices = Array.new(5) { UserPrice.new }
end

def create_multiple
@user_prices = params[:user_prices].values.collect { |up| UserPrice.new(up) }
if @user_prices.all?(&:valid?)
@user_prices.each(&:save!)
redirect_to :back, :notice => "Successfully added prices."
else
redirect_to :back, :notice => "Error, please try again."
end
end

最佳答案

这是一个试图在模型中做最好留给 Controller 的事情的例子。您在这里要做的就是在创建时根据未直接绑定(bind)到您的模型的参数自动分配某个属性。但是您甚至没有将那个额外的参数传递给任何地方的模型——您是从参数散列的 user_prices 部分创建模型实例,但是 user_price 子 -散列不在任何地方使用。无论如何,这是与 View 和采取的操作比模型更密切相关的行为,因此将其保留在 Controller 中。

试试这个:

  1. 抛弃虚拟属性,摆脱整个after_save 回调的东西
  2. 丢弃模型中的 user_prices 方法
  3. 在表单中将 all_dates 属性名称改回 purchase_date

那么你的参数散列应该是这样的:

{"user_price"=> { 
"purchase_date(2i)"=>"10",
"purchase_date(3i)"=>"27",
"purchase_date(1i)"=>"2011"
},
"user_prices"=>
{
"0"=>{"product_name"=>"Item1", "store"=>"Apple Store","price"=>"6"},
"1"=>{"product_name"=>"Item2", "store"=>"Apple Store", "price"=>"7"}
}}

剩下要做的就是将单个 user_price 属性合并到 create_multiple 操作中的每个 user_prices 子哈希中。将该操作的第一行替换为:

@user_prices = params[:user_prices].values.collect do |attributes| 
UserPrice.new(attributes.merge(params[:user_price]))
end

关于ruby-on-rails - 如何使用虚拟属性更新模型的属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7805352/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com