在rails上使用ruby中的默认值添加列迁移

时间:2015-05-29 18:03:03

标签: sql ruby-on-rails database sqlite activerecord

我正在使用SQLite3,我希望以下工作:

class AddNameToGoal < ActiveRecord::Migration
  def change
    add_column :goals, :goal_name, :text, default: goal.exercise.name
  end
end

或者这可能比我想做的更有意义:

add_column :goals, :gname, :text, default: Goal.find(row_id).exercise.name

如何让上述功能完成。

我怀疑它会起作用,但这就是我想要的。

具体而言,用户通过exercise_id列与练习相关联。

belongs_to :user
belongs_to :exercise
has_many :workouts, dependent: :destroy

(这是目标的模型)......

我希望用户能够为目标选择他们自己的名字,但我可以给他们提示在练习名称后命名目标,如果他们选择将其留空,则默认为练习名称。更重要的是,这必须发生在SQL端,以便稍后当我有一个集合下拉列表需要一个目标名称时,他们需要一个与练习相对应的名称。

<%= f.collection_select(:goal_id, @goals, :id, 
:goal_name, :include_blank => "Please Select") %>

练习模型是在Rails中制作的 id,Name,其他列。

练习模型:

class Exercise < ActiveRecord::Base
    has_one :goal

是否存在可行的策略。

另一种选择是帮助我找到积极记录的策略,以便我可以做到:

<%= f.collection_select(:goal_id, @goals, :id, 
:goal_name, :include_blank => "Please Select") %>

with(还有其他东西用exercise.name替换goal_name,如goal.exercise.name和goal.id,只显示ID。

2 个答案:

答案 0 :(得分:1)

在表上定义列时执行此操作是有问题的。我绝对认为在创作时,在模型中,这是你想要去的方式。

您也可以查看the default_value_for gem,看看是否有帮助。

答案 1 :(得分:0)

大家好,如果有人想要这样做:

我想出了一个策略......

这对于任何具有用户名称实例的内容都是完美的。

例如,您有一些跟踪您的Car的内容,并且您希望默认情况下为该Car提供来自Rails中该Car Make_and_Model(模型)的名称。

当有人说他们有一个新的“本田雅阁”时,他们会得到这个名字,但是如果他们想把它变成“露西”,因为她的名字是露西,你最好以她应得的尊重对待她!,这样你就可以选择这样做了。

您不想更改整个Make&amp; Model的名称,您只想更改car.make_and_model的特定belongs_to User的名称。

如果您想要某个名称默认为其他名称但允许用户更改该名称。在模型级别上执行此操作...通过在模型中设置before_save方法...就像这样:

before_save :default_values

  def default_values
    self.goal_name = self.exercise.name if self.goal_name.nil?
  end