簡體   English   中英

Ruby on Rails數據庫接口

[英]Ruby on rails database interface

我已經習慣了MySQL,但是現在嘗試使用Ruby on Rails。 在MySQL中,我將有兩個表,其中一個表包含對另一個表的引用(“帖子”指的是“主題”)。 執行我想要的MySQL查詢類似於“ SELECT * FROM Posts WHERE posts.topic =“ topic”(這里的“ topic”是一個變量)。

但是,嘗試使用Ruby模型使我感到困惑。 在控制器和視圖之間傳遞的變量為空,因為它們是空表。

在我的控制器中:

def topic
  @topic = Topic.where(params[:topic])
  @posts = Post.where(topic: @topic.object_id)
end

我不知道如何選擇主題由“ topic”變量定義的帖子。

在視圖中:

<% @posts.each do |post| %>
  <p><%= post.title %></p>
<% end %>

遷移文件:

class CreatePosts < ActiveRecord::Migration
  def change
    create_table :posts do |t|
      t.string :title
      t.string :text
      t.references :topic
      t.timestamps
    end
  end
end
class CreateTopics < ActiveRecord::Migration
  def change
    create_table :topics do |t|
      t.string :topic
      t.timestamps
    end
  end
end

鑒於帖子和主題是相關的,至少要根據您的遷移情況,您應該在模型中聲明“

class Topic
  has_many :posts

class Post
  belongs_to :topic

假設您有一個Topic實例@topic,則可以使用以下方法檢索所有相關記錄:

@posts = @topic.posts

我認為您放在控制器中的那些方法在哪里都可以,但是請記住,Rails的方式是“胖模型,瘦控制器”。 如果您將該邏輯作為方法放入模型中,則在控制器中讀取起來會容易得多。 另外,您應該研究一下scopes ,因為它們也會幫助您進行類似這樣的查詢。

無論如何,您應該在Topic模型中添加以下內容:

scope :by_name, ->(name) { where(topic: name) }

這基本上與執行以下操作相同:

def self.by_name(name)
  where(topic: name)
end

在您的帖子模型中,您可以執行以下操作:

scope :by_topic, ->(topic) { where(topic_id: topic) }

卡在控制器中的另一個問題是,當您使用范圍或“ where”時,它將返回一個數組,其中包含與查詢詞匹配的所有不同記錄。 因此,當您調用@topic = Topic.where(params [:topic])時,您將獲得一個對象數組。 因此,當您執行@ topic.id時,您嘗試獲取的是數組而不是一個對象的ID。

根據我之前向您展示的內容,這樣做更加有意義:

def topic
  @topic = Topic.by_name(params[:topic]).first #this returns the first record
  @post = Post.by_topic(@topic.id)
end

這將返回與您查詢的第一個主題名稱匹配的帖子數組。

好吧,首先是有關數據庫設計以及Rails(實際上是ActiveRecord)如何工作的入門知識。 基本上,您應該連接posts.topic_id = topic.id ,而不是posts.topic = topic.topic

您的遷移是正確的, create_table自動包含一個:id PRIMARY KEY列。 也就是說,您應該知道這些都是等效的:

t.references :topic
t.belongs_to :topic
t.integer :topic_id

在您看來,不是在提交表單時嵌入topic.topic並將其傳遞給控制器​​,而是在您的控制器中嵌入topic.idselect幫助程序文檔提供了一個很好的示例)。

@topic = Topic.find params[:id]
@posts = @topic.posts

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM