我有一个活动模型.事件可以具有父事件,从模型中的列(parent_event_id)设置.我需要能够has_many :event在模型上做,所以我可以做,例如,event.child_event或event.parent_event.但我的谷歌搜索并没有那么好.
我的型号:
class Event < ActiveRecord::Base
attr_accessible :days_before, :event_name, :event_date, :list_id, :recipient_email, :recipient_name, :parent_event_id, :is_deleted, :user_id
belongs_to :user
has_many :event_email
has_many :event
end
Run Code Online (Sandbox Code Playgroud)
我的架构:
create_table "events", :force => true do |t|
t.datetime "event_date"
t.integer "days_before"
t.string "recipient_email"
t.integer "list_id"
t.string "recipient_name"
t.datetime "created_at", :null => false
t.datetime "updated_at", :null => false
t.integer "user_id"
t.string "event_name"
t.integer "parent_event_id"
t.boolean "is_deleted", :default => false
end
Run Code Online (Sandbox Code Playgroud) 我怎样才能实现以下目标?我有两个模型(博客和读者)和一个JOIN表,它允许我在它们之间建立N:M关系:
class Blog < ActiveRecord::Base
has_many :blogs_readers, :dependent => :destroy
has_many :readers, :through => :blogs_readers
end
class Reader < ActiveRecord::Base
has_many :blogs_readers, :dependent => :destroy
has_many :blogs, :through => :blogs_readers
end
class BlogsReaders < ActiveRecord::Base
belongs_to :blog
belongs_to :reader
end
Run Code Online (Sandbox Code Playgroud)
我现在想做的是将读者添加到不同的博客中.但是,条件是我只能将博客添加到博客中.因此表中不得有任何重复(相同readerID,相同blogID)BlogsReaders.我怎样才能做到这一点?
第二个问题是,如何获得读者尚未订阅的博客列表(例如,填写下拉选择列表,然后可以将读者添加到另一个博客)?
什么是有效抓取父表的所有行的"轨道方式"以及每行的子节点数?
我不想使用,counter_cache因为我想根据一些时间条件运行这些计数.
陈词滥调的博客示例:文章表.每篇文章都有0条或更多条评论.
我希望能够提取每篇文章在过去一小时,一天,一周中有多少评论.
但是,理想情况下,我不想迭代列表并为每篇文章单独调用sql,也不想使用它:include来预取所有数据并在应用服务器上处理它.
我想运行一个SQL语句并获得一个包含所有信息的结果集.
我知道我可以硬编码了完整的SQL,也许可以使用.find,只是设置:joins,:group和:conditions参数......但我想知道如果有一个"更好"的方式......又名"轨道办法"
提前致谢
我尝试创建一个多态关联,这在Rails中很常见,但遗憾的是在Yii2中没有.作为实现的一部分,我需要定义关系:
public function getImages()
{
return $this->hasMany(RecipeImage::className(),
['imageable_id' => 'id', 'imageable_type' => 'Person']);
}
Run Code Online (Sandbox Code Playgroud)
但这不起作用,因为'Person'被视为当前模型的属性,但它是一个常量(多态关联的类名).
如果我尝试使用'andWhere',它当然会在WHERE子句而不是ON子句中添加条件,导致只返回包含现有图像的记录.
public function getImages()
{
return $this->hasMany(RecipeImage::className(), ['imageable_id' => 'id'])->
andWhere(['imageable_type' => 'Ingredient']);
}
Run Code Online (Sandbox Code Playgroud)
我该如何定义关系?没有andOn方法.
我想ActiveRecord通过表中的非id列进行查找.当我向你提供我的代码示例时,希望这很清楚.
class CoachClass < ActiveRecord::Base
belongs_to :coach
end
class Coach < ActiveRecord::Base
has_many :coach_classes, :foreign_key => 'user_name'
end
Run Code Online (Sandbox Code Playgroud)
当我这样做时
coach_obj.coach_classes,这正确地触发了
SELECT * FROM `coach_classes` WHERE (`coach_classes`.user_name = 2)
Run Code Online (Sandbox Code Playgroud)
(2是教练在id这里,这是我的问题.)
我想让它触发
SELECT * FROM `coach_classes` WHERE (`coach_classes`.user_name = 'David')
Run Code Online (Sandbox Code Playgroud)
('大卫'是那个教练的user_name)
user_name 是唯一的,并存在于两个表中.
出于某种原因coach_id,我不想在我的coach_classes桌子上.
activerecord ruby-on-rails foreign-key-relationship has-many belongs-to
我是测试和rails的新手,但我正试图让我的TDD进程正常运行.
我想知道你是否使用任何类型的范例来测试has_many:通过关系?(或者我认为一般只有has_many).
例如,我发现在我的模型规范中,我肯定会编写简单的测试来检查关系方法的关系的两端.
即:
require 'spec_helper'
describe Post do
before(:each) do
@attr = { :subject => "f00 Post Subject", :content => "8ar Post Body Content" }
end
describe "validations" do
...
end
describe "categorized posts" do
before(:each) do
@post = Post.create!(@attr)
end
it "should have a categories method" do
@post.should respond_to(:categories)
end
end
end
Run Code Online (Sandbox Code Playgroud)
然后在我的类别规范中,我做反向测试并检查@ category.posts
我还缺少什么?谢谢!!
我在rails中使用paper_trail来跟踪我的模型版本.但在GitHub库的文件表明,创业板不支持has_many,belongs_to协会.
假设我有一个应用程序记录了一些comapnies的ceos名称:
class Company < ActiveRecord::Base
has_many :ceos
has_paper_trail
end
class Ceo < ActiveRecord::Base
belongs_to :companies
has_paper_trail
end
Run Code Online (Sandbox Code Playgroud)
以上示例代表ABC Inc.的信息.
company.name => "ABC"
company.ceo.past => "John Henry"
company.ceo.present => "Amy Warren"
Run Code Online (Sandbox Code Playgroud)
如何实施以下操作,以便将公司和公司的ceos名称重置为上一版本?
我有一个简单的rails应用程序,包含模型项目和阶段.一个项目有很多阶段,但只有阶段可以一次激活(即"当前").我仍然希望其他阶段可以访问,但当前阶段应该是应用程序的主要锚点.关于如何实现此要求的决定对我如何处理模型访问,验证和创建更新的视图/表单具有重大影响.
所以问题是:如何在不增加太多复杂性的情况下实现这种"has_many但只有一个当前的关联"?主要目标是:简化当前阶段的访问+确保一次不能超过1个活动阶段.
当然,我自己也有一些想法,想出了三个选项,我想在这里提出.任何关于为什么我应该选择一个选项而不是另一个选项(或建议更简单的解决方案)的反馈将不胜感激:
第一选择:
[Project] has_many :phases
[Project] has_one :current_phase, :class_name => "Phase", :conditions => { :current => true }
Run Code Online (Sandbox Code Playgroud)
缺点:我有一个用于创建项目和相应阶段的嵌套表单.似乎没有简单的方法可以将新创建的一个阶段设置为活动状态
第二种选择:
[Project] has an attribute "current_phase_id"
[Project] has_many :phases
[Project] belongs_to phase, :foreign_key => "current_phase_id"
Run Code Online (Sandbox Code Playgroud)
缺点:与选项1相同,但我有另一个属性和belongs_to关联,这似乎很奇怪(为什么一个项目属于其中一个阶段?)
第三种选择:
[Phase] has an attribute "active" (boolean)
[Phase] scope :active, :conditions => { :active => true}
# Access to current phase via: project.phases.active
Run Code Online (Sandbox Code Playgroud)
缺点:我必须通过验证确保一次只有一个活动阶段,如果同时创建/编辑多个阶段或从一个阶段切换到另一个阶段,则很难; 加:project.phases.active返回一个数组,如果我没有弄错的话
非常感谢您的帮助.谢谢!
增加了奖励以鼓励就该主题提出进一步意见.Bounty将获得最佳解决上述主要目标的解决方案; 或者如果没有提到替代解决方案,那么答案最能解释为什么我应该支持给定选项中的一个而不是另一个.谢谢!
我如何获得模型的has_many关联?
例如,如果我有这个类:
class A < ActiveRecord::Base
has_many B
has_many C
end
Run Code Online (Sandbox Code Playgroud)
我会这样的方法:
A.get_has_many
Run Code Online (Sandbox Code Playgroud)
那回归
[B,C]
Run Code Online (Sandbox Code Playgroud)
可能吗?谢谢!
我不确定我的问题措辞是否正确.
我有三个型号:User,Item,和UserItem.
user has_many :user_items
user has_many :items, through :user_items
item has_many :user_items
item has_many :users -> {uniq}, through :user_items
item belongs_to :user
user_item belongs_to :user
user_item belongs_to :item
Run Code Online (Sandbox Code Playgroud)
我需要一种方法来查看用户是否有一个项目if在我的项目视图中生成语句但是这里是catch,user_items enum status: [ :pending, approved].所以我需要看看是否current_user有某个:pending项目.
例如,当用户访问item1的视图页面时,我有item_controller的show动作声明@item = Item.find_by_id(params[:id]).但是,我可以用这个@item来看看用户是否有这个项目?
has-many ×10
activerecord ×3
associations ×3
ruby ×3
belongs-to ×1
duplicates ×1
grouping ×1
model ×1
relation ×1
rspec ×1
yii2 ×1