[英]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.id
( select幫助程序的文檔提供了一個很好的示例)。
@topic = Topic.find params[:id]
@posts = @topic.posts
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.