如何在Rails中引用相关表?

时间:2014-04-03 00:11:01

标签: ruby-on-rails database

目前在seeds.rb我有这样的代码:

Mission.create({ name: "Web Platform", status_id: 3});

# Statuses
Status.create({ name: "active"})
Status.create({ name: "complete"})
Status.create({ name: "future"})

这似乎非常错误(因为从外面这个status_id看起来像一个没有意义的神奇数字,因为依赖于顺序(或手动设置id))但我找不到:怎么做更好?

3 个答案:

答案 0 :(得分:1)

一个简单的解决方案是将您的状态分配给变量,然后使用它们。

# Statuses
active   = Status.create({ name: "active"})
complete = Status.create({ name: "complete"})
future   = Status.create({ name: "future"})

Mission.create({ name: "Web Platform", status_id: future.id});

答案 1 :(得分:1)

假设您的任务has_one :status和状态belongs_to :mission

这样的事情:

Status.create(name: 'active')
# Same for complete and future

mission = Mission.build(name: 'Web Platform')
mission.status = Status.where(name: 'future').first
mission.save

甚至更好,改进您的模型状态类

class Status < ActiveRecord::Base
    def self.status_active
        where(name: 'active').first_or_create
    end

    def self.status_complete
        where(name: 'complete').first_or_create
    end
    # Etc...
end

然后你可以做

mission = Mission.build(name: 'Web Platform')
mission.status = Status.status_future
mission.save!

无需手动创建状态(感谢 Mike Manfrin 建议)

答案 2 :(得分:0)

假设你的任务has_one:status

mission = Mission.create name: "Web Platform"
mission.status.create name: "active"

然后您可以通过输入以下内容来编辑状态:

mission.status.update_attributes name: "future"