Rails Rails Association 疑问

ray · 2012年04月16日 · 最后由 ray 回复于 2012年04月16日 · 3643 次阅读

User Model 添加了 has_many :orders Order Model 添加了 belongs_to :user

生成了一个 migration,给 order 加入了 add_column :orders, :user_id, :integer

但是在生成 order 里没有 user_id 的数据。

有什么地方错了么?

rake db:migrate

#1 楼 @calebx 做了迁移了。

#1 楼 @calebx 数据库里看不到 user_id 的数据。为空的

你确定你 rake db:migration 没有出错? 你确定你看的数据库位置对了?

上面的幾行是在定義表與表間的關係。真正哪一張 order 由哪一位用戶所產生,仍是需要你在 controller 中產生 oroder 實例時設定 (系統怎麼知道該訂單由誰下?)。設定方法很多種。

# orders#create
current_user.orders << order

或者

# 在 orders#new 中
@order = current_user.orders

# 並在表單中放入隱藏欄位,表單送出時才能得知是哪位用戶下的訂單
= f.hidden_field :user_id

# 如果是這樣,在 orders#create 中只要 Order.create!(params[:order]) 即可。

這個系統有 bug,上面留言的不是我的帳號。

是我的留言,但我不是 @hSATAC !!

#4 楼 @huacnlee 数据库位置应该对的。

#5 楼 @hSATAC controller 里是没有添加 current_user,请问这个 current_user 是 rails 默认的机制么?在 Guide 里有说明么?谢谢。

@ray, @hSATAC 说的 current_user 不是 rails 的默认机制,应该是 Devise 这个 gem 引入的。https://github.com/plataformatec/devise

關於 current_user 可參考 devise。

上面數據庫的設計及 model 間的關聯設定是對的。只缺在存入資料時,要寫入是誰下的訂單。這是意義問題,不是結構問題。如上所說,要讓 user_id 有值,方法很多。但總要有地方去放入那個值。

以上 5/6/7 樓是我寫的。(@hSATAC 不是我的帳號。我已去站上反饋提報這個問題。)

@ray 你能确定 在 create or update 的时候 有 order.user 的指定 或者直接给定 order.user_id 吗 还有 你 Order.new 的时候 有 user_id 的字段吗 字段存在与否 实际上和 model 是没有必然关系的

#11 楼 @jhjguxin order.new 時,即使 @order 裡有 user_id 的值,但透過表單回傳時,若沒有加上該 user_id(一般皆設為隱藏),submit 的 params[:order] 裡仍然會沒有 user_id 字段。

由於 order 這類操作一般皆為當下用戶操作,所以其實可以在 orders#create 直接賦值就好。也就是

current_user.orders.crate(params[:order])
# 這行指令就是以 "User Model 添加了 has_many :orders" 的設定為前提


作的事。

這種方式另有一個安全上的優點:(對比於用 form 裡的 = f.hidden_field :user_id) 我們是否允許用戶任意指定訂單為他人所建?若不允許的話,直接取得 current_user (就是當下登入的帳號) 並用它產生訂單,那 user_id 就一定會是 current_user.id,而不能是別的。

#10 楼 @cactis #11 楼 @jhjguxin 其实说白了,就是需要给 user_id 存入相应的 user_id 吧。

#9 楼 @tyraeltong Devise 这个 Gem 需不需要在 Gemfile 里写明?我看 Ruby-china 的源码里也用了 current_user 之类的,但是没有包含在 Gemfile 里

https://github.com/huacnlee/ruby-china/blob/master/Gemfile

# 用户系统
gem 'devise', '1.5.2'

Ruby China 也是用 devise。

@ray 那是肯定要指定的 否则 系统怎么会知道你 要指定那个用户呢 那个 Gemfile 的问题 那是肯定要的 因为 rails 3.2 都是使用 bundle 那管理 扩展 gem 的了 而废弃 plugin 的方式了 而 bundle 的话一般是在 Gemfile 中指定的(也可以 gemspec)楼主还很缺 多多 看 demo 多多读文档吧

#15 楼 @jhjguxin 新手,多多指教了。

cactis 系統帳號認證錯亂問題 提及了此话题。 04月03日 10:56
需要 登录 后方可回复, 如果你还没有账号请 注册新账号