如何从SQL查询中的另一个模型调用关联的属性?

时间:2016-08-19 20:28:33

标签: ruby-on-rails json ajax postgresql api

我目前正在使用具有本地API的rails应用程序,我通过ajax请求从我的主模型Book.rb请求搜索功能的数据。

我希望能够在Book.rb SQL查询中包含Category.rb属性。

db结构就像这样。

class Book < ActiveRecord::Base
   has_many :book_category_relations
   has_many :categories, through: :book_category_relations 
end

class BookCategoryRelation < ActiveRecord::Base
    belongs_to :book
    belongs_to :category
end

class Category < ActiveRecord::Base
    has_many :books, through: :book_category_relations
    has_many :book_category_relations
end

这是我在book.rb上查询的问题。

Book.rb
    scope :search, -> query { where("lower(title) LIKE ? OR lower(author) LIKE ? OR lower(publisher) LIKE ? OR lower(publication_year) LIKE ? OR lower(country_of_origin) LIKE ? OR lower(description) LIKE ? OR lower(category) LIKE ?", 
      "%#{query}%".downcase, "%#{query}%".downcase, "%#{query}%".downcase, "%#{query}%".downcase, "%#{query}%".downcase, "%#{query}%".downcase, "%#{query}%".downcase) }
end

这就是我的.json.jbuilder的样子。

app/views/api/books/index.json.jbuilder

json.array! @books do |book|
  json.title book.title
  json.author book.author
  json.publisher book.publisher
  json.image_url book.cover.url
  json.id book.id
  json.publication_year book.publication_year
  json.country_of_origin book.country_of_origin
  json.description book.description
  json.price book.price
  if book.categories[0] != nil
   json.category book.categories[0].name
  end
end

我希望能够将Book.categories.name纳入我在图书模型中定义的范围,以便我可以按照与我的图书模型相关的类别进行搜索。

我试过了: 低(book.categories) 2. lower(book.category.name)

这是api通过http://localhost:3000/api/books/?utf8=%E2%9C%93&search=diccionario

的视图
[
 {
 title: "DICCIONARIO DEL ESPAÑOL JURIDICO",
 author: "Santiago Muñoz Machado",
 publisher: "Consejo General del Poder Judicial",
 image_url:      "/system/books/covers/000/",
 id: 30,
 publication_year: "2016",
 country_of_origin: "España",
 description: null,
 price: "175.0",
 category: [
   {
    name: "Diccionarios"
   }
  ]
 }
]

赞赏任何提示,提示或参考!

1 个答案:

答案 0 :(得分:0)

install.packages("data.table")
library(data.table)
datadt <- as.data.table(data)
datadt[,sentence.count:=sum(nchar(label))+.N-1,by=SentenceID]

所以,我错过了一个&#39;加入(:类别)&#39;在我之前。

当我们在模型中定义一个像has_many或:belongs_to这样的关系时,rails活动记录会自动执行此操作,但是由于我的sql查询响应了javascript函数而不是rails方法,因此必须在我的作用域上声明它。