我有以下两个相关模型:
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)
答案 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)