如何理解模型Rails中的关系

时间:2015-12-10 13:11:17

标签: ruby-on-rails activerecord

比如如何从同一个模型的另一个获取数据? this site通常写作建立模型之间的关系,但在这种情况下不清楚获取数据 可以通过实例咨询书籍或在线资源吗?

示例:

class Foto <ActiveRecord :: Base
   belongs_to: action
End

class Action <ActiveRecord :: Base
   has_many: foto
end

ActiveRecord :: Schema.define (version: 20151207105829) do
   create_table "actions", force:: cascade do | t |
     t.text "name"
   end
   create_table "fotos", force:: cascade do | t |
     t.text "fname"
     t.integer "action_id"
     t.text "image"
   end
end

如何获取以下SQL

SELECT * FROM fotos
  INNER JOIN actions ON fotos.action_id = actions.id

3 个答案:

答案 0 :(得分:1)

这是标准belongs_to/has_many关系 - 您希望通过数据库引用关联两个模型。

-

您已经完成了艰苦的工作 - 您的数据库中有相关的foreign_keyaction_id),这意味着您将能够执行以下操作:

#config/routes.rb
resources :actions do
   resources :fotos, only: [:new, :create]
end

#app/controllers/fotos_controller.rb
class FotosController < ApplicationController
   def new
      @action = Action.find params[:action_id]
      @foto = @action.fotos.new
   end

   def create
      @action = Action.find params[:action_id]
      @foto = @action.fotos.new foto_params
   end

   private

   def foto_params
      params.require(:foto).permit(:fname, :image)
   end
end

答案 1 :(得分:0)

以下ActiveRecord语句应该为您提供特定操作的照片

Action.find(name: "pass the name here").fotos 

或者如果你想以相反的关系遍历

Foto.find(fname: "pass the fname here").action

注意 您的关系很重要,因为您需要复制类的名称以相应地获取它们。

答案 2 :(得分:0)

Rich Peck有完全正确的答案。但是他应该补充一点,你可以在创建一些照片后使用@action.fotos来完成照片。

即。 @action.fotos将存储属于某些@action的所有照片,并与

对应
SELECT * FROM fotos
INNER JOIN actions ON fotos.action_id = actions.id