Active Record Retrieve belongs_to

时间:2015-11-10 18:23:30

标签: ruby rails-activerecord

我有以下两个相关模型:

class Post < ActiveRecord::Base
  belongs_to :language

  def self.are_visible
    self.where(:visible => true)
  end
end

class Language < ActiveRecord::Base
  has_many :posts
end

Schema.rb

create_table "languages", force: true do |t|
  t.string   "name_de"
  t.string   "name_en"
end

create_table "posts", force: true do |t|
  t.string   "title"
  t.text     "description"
  t.integer  "language_id"
end

add_index "posts", ["language_id"], name: "index_posts_on_language_id"

如何列出所有可见商店的所有语言而不重复?

我想要这样的事情:

@languages = Post.are_visible.select(:language).uniq

但是这会导致以下错误

PG::UndefinedColumn: ERROR:  column "language" does not exist

当然这个列不存在,只有列language_id存在于表中。

我想知道为什么这么复杂,因为在C#Linq我会写:

Repository.Posts.Where(p => p.Visible).Select(p => p.Language).Distinct()

我会得到匹配帖子的所有地点。但不知何故,我认为我需要从根本上改变我的方法,以使其成为积极的记录。

更新:按以下方式运行:

@languages = Post.joins(:language).are_visible.uniq.pluck(:name_de)

3 个答案:

答案 0 :(得分:0)

您设置的方式,每个帖子记录只有一种语言。你不能通过ActiveRecord以这种方式使用它们。但是,你可以通过语言获得帖子。

@posts = @language.posts

在这些模型之间建立has and belongs to many relationship可能更有意义。

答案 1 :(得分:0)

你试过scope吗?然后,您应该可以使用select或获取可见帖子的语言:

class Post < ActiveRecord::Base
  belongs_to :language
  scope -> :are_visible { where(visible: true) }
end

当然,如果你在Post表中看到一个只有布尔值的列。

编辑:

尝试添加join

@languages = Post.joins(:language).are_visible.select(:language).uniq

答案 2 :(得分:0)

好的,所以我没有让这个工作,所以我改变了我的方法。

@languages = Post.joins(:language).are_visible.uniq.pluck(:name_de)